Oracle CLOB数据类型出现错误:`SQL错误:ORA-01704:字符串文字太长`

Oracle CLOB数据类型出现错误:`SQL错误:ORA-01704:字符串文字太长`,oracle,insert,clob,Oracle,Insert,Clob,总之,我在Oracle中将列c1定义为CLOB。我试图使用sql查询insert into t1 values()插入一个大文本此查询给出的错误为SQL错误:ORA-01704:字符串文字太长。当我将数据分成多个块并使用sql命令插入时:insert into values(to_clob()| | to_clob()),已成功。 我不明白为什么将列定义为CLOB并尝试插入大文本失败了? 将大文本分成小文本块是唯一的解决方案吗?我假设您的查询是: 插入t1(clob_列)值(“

总之,我在Oracle中将列c1定义为CLOB。我试图使用sql查询
insert into t1 values()插入一个大文本此查询给出的错误为
SQL错误:ORA-01704:字符串文字太长
。当我将数据分成多个块并使用sql命令插入时:
insert into values(to_clob()| | to_clob()),已成功。
我不明白为什么将列定义为CLOB并尝试插入大文本失败了?

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

我假设您的查询是:

插入t1(clob_列)值(“<…超过4000个字符…”);
'
分隔将成为
CHAR
VARCHAR2
数据类型的字符串文字;它并不表示文本是
CLOB
数据类型。因此,如果您尝试将超过4000字节的字符放入其中,那么它将失败,因为文本(由周围的
'
字符表示)将大于其最大大小

当我将其划分为多个块并使用SQL命令插入时:

插入t1(clob_列)值(to_clob(“”)| to_clob(“”));
这是成功的

这是因为没有一个字符串文本包含超过4000字节的字符

或者,您可以使用:

插入t1(clob_列)
值(空的_CLOB()| |“”| |“”);
如果没有
EMPTY_CLOB()
,连接运算符
|
会将两个字符串文字连接成一个字符串文字(并失败,因为生成的文字将超过4000字节);当使用
EMPTY\u CLOB()
时,您告诉SQL解析器来自串联运算符的结果表达式应该是左侧操作数的
CLOB
数据类型,而不是文本的
CHAR
VARCHAR2
数据类型。当您将文本包装在
TO_CLOB
函数中时,情况也是如此,然后串联将产生
CLOB
结果

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

不,你可以:

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

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

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

值来自哪里?字符串文字限制为
varchar2
的长度。但是想要将
clob
值作为文本插入,这是非常少见的。如果应用程序中有SQL语句,则通常会对文本值使用绑定变量,该变量不受字符串文本长度的限制。您将其通过Java工作的事实归因于错误的事情。当作为绑定变量传递时,您可以将值作为
CLOB
数据类型传递,该数据类型的字符数可以超过4000字节。当您尝试在SQL中创建字符串文字时(无论客户端是什么),它与
CHAR
/
VARCHAR2
数据类型具有相同的限制,并且不能超过4000字节。如果您说您是以Java中超过4000字节的
CHAR
/
VARCHAR2
的形式传递它,那么我建议您在答案中包含代码,因为您会发现事实并非如此。