【问题标题】:ORA-01704: string literal too longORA-01704: 字符串文字太长
【发布时间】:2015-09-10 12:13:30
【问题描述】:

我正在尝试使用 PL/SQL Developer 将记录插入 Oracle 数据库。

我的表中有一个 CLOB 数据类型,我要保存的 XML 大约有 60000 个字符。

当我直接尝试使用插入语句执行此操作时,它给了我 ORA-01704 错误。所以我在论坛上阅读并尝试使用绑定变量来做到这一点,但我仍然收到“字符串文字太长”的消息。

我的绑定变量代码是:

declare
vClobVal varchar2(32767) := 'String of 60000 characters';
update table_name set column where clause.
end;

我了解varchar2(32767) 的字符数限制为 32767。但是当我必须插入 60000 个字符时该怎么办?我也尝试过使用 CLOB 变量:

declare
vClobVal clob := 'String of 60000 characters';
update table_name set column where clause.
end;

这也给了我同样的错误。

【问题讨论】:

  • vClobVal 并不是一个真正的绑定变量,它是一个 PL/SQL 局部变量(尽管它在您的插入中用作绑定变量,有点像他的解析器)。 CLOB 版本仍在尝试使用 60000 个字符的字符串文字 - 单引号之间的位。您没有尝试用该文字实际创建一个 CLOB,因为无法创建文字本身。您必须使用较短的字符串逐步构建您的 CLOB,这并不总是理想的。你的 XML 究竟来自哪里?
  • 几乎是this 的复制品,而dbms_lob.append 的答案也适用于此。但如果 XML 在文件中,则有更好的方法来加载它。

标签: sql oracle clob


【解决方案1】:

问题在于字符串文字被限制为少于 60000 个字符。

declare vClobVal clob := 'String of 60000 characters';

无论您将 vClobVal 声明为 CLOB,:= 之后的文字仍然是一个字符串(您希望将其转换为 clob)。

据我所知,Oracle 不知道诸如 CLOB'60000 characters...' 这样的 CLOB 文字。因此,您唯一的选择是使用较小的字符串并将它们一一添加到 CLOB 中:

declare
  vstr_part1  varchar2(32767) := 'first 300000 characters';
  vstr_part2  varchar2(32767) := 'next 300000 characters';
  vClobVal    clob;
begin
  vClobVal := vstr_part1;
  vClobVal := vClobVal || vstr_part2;

  ...
end;

【讨论】:

  • 这个答案有效。但我在寻找别的东西。这里唯一的问题是对于每个插入语句,我必须手动计算要放入 var1 和 var2 的字符数。猜猜,如果没有简单的出路,我可以忍受。
  • @Alex Poole:这里没有中间 varchar2。有一个 CLOB 被分配了一个 varchar2,因此 varchar2 被转换为 clob 并存储在该 clob 变量中。然后将一秒 varchar2 添加到 clob。 varchar2 再次被转换为 clob,然后这个 clob 被附加到 clob 变量中。因此没有中间 varchar2,而是中间 clob。
  • 是的,对不起,我的错误;混淆将两个长 varchar 连接到 CLOB 中,这不是您正在做的事情。
猜你喜欢
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多