我在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功能。对此的任何帮助都非常感谢。
注意:我在示例中使用了一个简单的表,但实际上该表有几列,update语句必须一次更新许多列。
答案 0 :(得分: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>