首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新具有CLOB列的表时出错:ORA-01461

更新具有CLOB列的表时出错:ORA-01461
EN

Stack Overflow用户
提问于 2013-04-04 00:09:00
回答 1查看 7.5K关注 0票数 1

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

代码语言:javascript
复制
create table test_clob(
id1 number,
clob_col clob);

如果我尝试将一个大小大于4000的varchar2变量插入到CLOB列中,它插入时没有任何问题。

代码语言:javascript
复制
insert into test_clob values (1,rpad('a',32760,'a'));
commit;

如果我尝试更新CLOB列,如下所示,它工作得非常好。

代码语言:javascript
复制
update test_clob set clob_col = rpad('b',32760,'b') where id1 = 1;
commit;

但是,如果我尝试按如下方式运行update语句,它将失败,因为出现了"ORA-01461: can bind a LONG value only for insert into a LONG column“错误。

代码语言:javascript
复制
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语句必须一次更新多个列。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-04 00:17:25

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

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

例如:

代码语言:javascript
复制
SQL> select length(rpad('a',32760,'a'))  from dual;

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

它默默地将回报限制在4k以内。但pl/sql不会限制为4k:

代码语言:javascript
复制
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)

代码语言:javascript
复制
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>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15792472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档