错误:ORA-01704:字符串文字太长

Posted

技术标签:

【中文标题】错误:ORA-01704:字符串文字太长【英文标题】:Error : ORA-01704: string literal too long 【发布时间】:2012-12-06 09:52:09 【问题描述】:

当我尝试在数据类型为 CLOB 的字段上设置超过 4000 个字符的值时,它给了我这个错误:

ORA-01704:字符串文字太长。

任何建议,如果我必须设置无限字符的值,哪种数据类型适用于我,尽管就我而言,它恰好是 15000 字符。

注意:我尝试存储的长字符串以 ANSI 编码。

【问题讨论】:

【参考方案1】:

你在用CLOB操作的时候用的是什么?

在所有情况下,您都可以使用 PL/SQL 来完成

DECLARE
  str varchar2(32767);
BEGIN
  str := 'Very-very-...-very-very-very-very-very-very long string value';
  update t1 set col1 = str;
END;
/

Proof link on SQLFiddle

【讨论】:

谢谢,但是 CI 不支持这些程序的东西***.com/questions/13946641/… 我猜你可以将此代码包装在一个过程中,Codeigniter 可以执行它。抱歉,我没有用于检查的 Codeigniter。看这里link 做到了,但我可以定义 varchar2 的大小吗,检查这个链接,***.com/questions/13947222/… this info (http://www.oracle.com/technetwork/articles/fuecks-lobs-095315.html) 对你有用吗? 我不知道我在某处做了什么改变,但现在工作正常。谢谢。但我仍然不清楚为什么同样的事情在直接查询中不起作用。我们是否总是必须这样做来存储具有 4000 个或更多字符的字符串?【参考方案2】:

尝试像下面的查询那样将字符分成多个块并尝试:

Insert into table (clob_column) values ( to_clob( 'chunk 1' ) || to_clob( 'chunk 2' ) );

它对我有用。

【讨论】:

我确认,即使在简单的插入语句到 clob 列中,这个也对我有用 这个可行,但是使用 to_clob() 有什么缺点吗?【参考方案3】:

为了解决我这边的这个问题,我不得不使用那里已经提出的组合

DECLARE
  chunk1 CLOB; chunk2 CLOB; chunk3 CLOB;
BEGIN
  chunk1 := 'very long literal part 1';
  chunk2 := 'very long literal part 2';
  chunk3 := 'very long literal part 3';

  INSERT INTO table (MY_CLOB)
  SELECT ( chunk1 || chunk2 || chunk3 ) FROM dual;
END;

希望这会有所帮助。

【讨论】:

【参考方案4】:

拆分工作直到 4000 个字符,具体取决于您插入的字符。如果您要插入特殊字符,它可能会失败。 唯一安全的方法是声明一个变量。

【讨论】:

【参考方案5】:

虽然这是一个非常古老的问题,但我认为分享经验仍然可能对其他人有所帮助:

如果我们使用 '||' 将大文本拆分为 4000 个字节/字符的块,则可以将大文本保存在单个查询中

运行以下查询会告诉你:

    要求包含 4000 字节的块数 剩余字节数

因为,在给定的示例中,您尝试保存连续 15000 个字节(字符)的文本,所以,

select 15000/4000 chunk,mod(15000,4000) remaining_bytes from dual;

结果:

也就是说,你需要连接 3 个 4000 字节的块和一个 3000 字节的块,所以它会是这样的:

INSERT INTO <YOUR_TABLE> 
VALUES (TO_CLOB('<1st_4K_bytes>') || 
        TO_CLOB('<2nd_4K_bytes>') || 
        TO_CLOB('<3rd_4K_bytes>') || 
        TO_CLOB('<last_3K_bytes>)');

【讨论】:

【参考方案6】:
INSERT INTO table(clob_column) SELECT TO_CLOB(q'[chunk1]') || TO_CLOB(q'[chunk2]') ||
            TO_CLOB(q'[chunk3]') || TO_CLOB(q'[chunk4]') FROM DUAL;

【讨论】:

以上是关于错误:ORA-01704:字符串文字太长的主要内容,如果未能解决你的问题,请参考以下文章

ora 01704 字符串文字太长

JAVA中操作CLOB大对象 ,提示ORA-01704字符串文字太长

ORA-01704 错误,插入长度超过 4000 个字符的字符串

CLOB 列和 SQL 插入文件

今天犯了个常识错误

Python 插入长文本至Oracle