【问题标题】:Oracle CLOB data type giving an error: `SQL Error: ORA-01704: string literal too long`Oracle CLOB 数据类型给出错误:`SQL 错误:ORA-01704:字符串文字太长`
【发布时间】:2021-04-06 18:36:36
【问题描述】:

所有,我已在 Oracle 中将列 c1 定义为 CLOB。我正在尝试使用 sql 查询 insert into t1 values(<large text>); 插入大文本,此查询给出的错误为 SQL Error: ORA-01704: string literal too long。当我将其分成多个块并使用sql命令插入时:insert into values (to_clob(<chunk1>) || to_clob(<chunk2>));,是成功的。 我不明白为什么将列定义为 CLOB 并尝试插入大文本失败? 将大文本分成更小的块是唯一的解决方案吗?

【问题讨论】:

  • 价值从何而来?字符串文字被限制为varchar2 的长度。但是想要插入一个clob 值作为文字真的很少见。如果您在应用程序中有一条 SQL 语句,您通常会为文本值使用绑定变量,它对字符串文字的长度没有限制。

标签: oracle insert clob


【解决方案1】:

我假设您的查询是:

insert into t1 ( clob_column ) values( '< ... more than 4000 characters .... >' );

'' 分隔一个字符串字面量,该字面量将是CHARVARCHAR2 数据类型;它并不表示该文字是 CLOB 数据类型。因此,如果您尝试将超过 4000 字节的字符放入其中,则会失败,因为文字(由周围的 '' 字符表示)将大于其最大大小。

当我将它分成多个块并使用 SQL 命令插入时:

INSERT INTO t1 ( clob_column ) values (to_clob('<chunk1>') || to_clob('<chunk2>'));

成功了。

这是因为您的字符串文字都不包含超过 4000 个字节的字符。

或者,您可以使用:

INSERT INTO t1 ( clob_column )
VALUES ( EMPTY_CLOB() || '<chunk1>' || '<chunk2>' );

如果没有EMPTY_CLOB(),连接运算符|| 会将两个字符串文字连接成一个字符串文字(并失败,因为结果文字将超过4000 个字节);使用EMPTY_CLOB() 时,您告诉SQL 解析器连接运算符的结果表达式应该是左侧操作数的CLOB 数据类型,而不是文字的CHARVARCHAR2 数据类型。当您将文字包装在 TO_CLOB 函数中时也是如此,然后连接将导致 CLOB 结果。

将大文本分成更小的块是唯一的解决方案吗?

不,你可以:

  • 从文件中加载CLOB;或
  • CLOB 值作为绑定变量从第三方应用程序传递。

但是,如果您想完全在 SQL 查询中声明它,那么您不能声明大于 4000 字节的字符串文字,如果您尝试这样做,是的,您需要将它们分成适当大小的块。

【讨论】:

    【解决方案2】:

    超过 4000 个字符的字符串文字看起来像是 SQL 客户端的限制。当我编写一个包含大数据的变量并在插入查询中使用该变量的过程时,它起作用了。此外,当我通过 Java 代码测试相同的行为时,它运行良好。所以结束这个问题。

    【讨论】:

    • 您将它通过 Java 工作的事实归因于错误的事情。当作为绑定变量传递时,您可以将值作为 CLOB 数据类型传递,并且可以包含超过 4000 个字节的字符。当您尝试在 SQL(无论客户端)中创建字符串文字时,它具有与 CHAR/VARCHAR2 数据类型相同的限制,并且不能超过 4000 个字节。如果您说您将其作为CHAR/VARCHAR2 传递,Java 中超过 4000 个字节,那么我建议您在edit 您的答案中包含代码,因为您会发现那不是案例。
    猜你喜欢
    • 1970-01-01
    • 2012-12-06
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多