1

我在 Oracle 数据库中有一个表,如下所示,

create table test_clob(
id1 number,
clob_col clob);

如果我尝试将大小超过 4000 的 varchar2 变量插入 CLOB 列,它会毫无问题地插入。

insert into test_clob values (1,rpad('a',32760,'a'));
commit;

如果我尝试如下更新 CLOB 列,它工作得很好。

update test_clob set clob_col = rpad('b',32760,'b') where id1 = 1;
commit;

但是,如果我尝试按如下方式运行更新语句,则会由于“ORA-01461:只能绑定 LONG 值以插入 LONG 列”错误而失败。

declare
large_string varchar2(32767) := rpad('c',32760,'c');
begin
update test_clob set clob_col = nvl(large_string,clob_col) where id1 = 1;
commit;
end;

我怀疑是 NVL 功能导致了问题。对此的任何帮助都将受到高度赞赏。

注意:我在示例中使用了一个简单的表,但实际上该表有几个列,并且更新语句必须一次更新许多列。

4

1 回答 1

3

实际上,rpad('a',32760,'a')当从 SQL 调用时只会返回一个 4k 字符串,这就是它起作用的原因。

SQL 中的Varchar类型限制为 4k,因此当您尝试从 pl/sql 绑定 32k varchar2 变量时,它将失败(因为从 pl/sql 调用 rpad 将返回 32k)。

例如:

SQL> select length(rpad('a',32760,'a'))  from dual;

LENGTH(RPAD('A',32760,'A'))
---------------------------
                       4000

它默默地为您限制返回到 4k。但 pl/sql 不会限制为 4k:

SQL> declare
  2  large_string varchar2(32767) := rpad('c',32760,'c');
  3  begin
  4  dbms_output.put_line(length(large_string));
  5  end;
  6  /
32760

您应该将您的 pl/sql 变量定义为clob而不是varchar2(32760)

SQL> create table test_clob(
  2  id1 number,
  3  clob_col clob);

Table created.

SQL> insert into test_clob values (1,rpad('a',32760,'a'));

1 row created.

SQL> select length(clob_col) from test_clob;

LENGTH(CLOB_COL)
----------------
            4000

SQL> commit;

Commit complete.

SQL> declare
  2  large_string clob := rpad('c',32760,'c');
  3  begin
  4  update test_clob set clob_col = nvl(large_string,clob_col) where id1 = 1;
  5  commit;
  6  end;
  7  /

PL/SQL procedure successfully completed.

SQL> select length(clob_col) from test_clob;

LENGTH(CLOB_COL)
----------------
           32760

SQL>
于 2013-04-03T16:17:25.287 回答