ORA-01489 - 字符串连接的结果太长 - 附加大 Varchar 列

Posted

技术标签:

【中文标题】ORA-01489 - 字符串连接的结果太长 - 附加大 Varchar 列【英文标题】:ORA-01489 - Result of string concatenation is too long - Append big Varchar columns 【发布时间】:2020-05-12 17:06:26 【问题描述】:

我正在尝试追加 4 列数据类型,例如 varchar2(4000) || varchar2(4000) || varchar2(4000) || varchar2(100) 并尝试将其分配给表的 CLOB 数据类型列。

如下所示,

insert into test as select TO_CLOB (A || B || C  || D) as final from test_a;

表 1:测试

A CLOB;

表 2:Test_a

A varchar2(4000) 

B varchar2(4000) 

C varchar2(4000) 

C varchar2(100) 

我得到的错误是ORA-01489 Result of string concatenation is too long

我也尝试过像下面这样单独进行 CLOB 转换,但执行时间太长。

insert into test 
as select TO_CLOB (A )  || TO_CLOB (B ) || TO_CLOB (C ) || TO_CLOB (D ) ) as final from test_a;

如果有其他方法,请告诉我。

附:我正在使用Oracle 12c version

【问题讨论】:

【参考方案1】:

当 || 的参数之一发生时,会发生对 clob 的隐式转换。是一个 clob,所以请尝试以下操作:

原始查询:

select rpad('0', 4000, '0')||rpad('0', 4000, '0')||rpad('0', 4000, '0')||rpad('0', 4000, '0')||rpad('0', 100, '0') from dual
ORA-01489: result of string concatenation is too long

连接的第一个成员中的TO_CLOB:

select TO_CLOB(rpad('0', 4000, '0'))||rpad('0', 4000, '0')||rpad('0', 4000, '0')||rpad('0', 4000, '0')||rpad('0', 100, '0') from dual
1 row(s) selected

【讨论】:

【参考方案2】:

您可以使用DBMS_LOB.writeappend 插入 CLOB,例如如下所示

    declare       
    l_clob clob := '12345';     
    A varchar2(4000):=lpad('A',4000,'A');       
    B varchar2(4000):=lpad('B',4000,'B');     
    C varchar2(4000):=lpad('C',4000,'C');      
    begin       
    dbms_lob.writeappend( l_clob, length(A), A );        
    dbms_lob.writeappend( l_clob, length(B), B );        
    dbms_lob.writeappend( l_clob, length(C), C );       
    insert into test_clob values(l_clob);
    end;

【讨论】:

以上是关于ORA-01489 - 字符串连接的结果太长 - 附加大 Varchar 列的主要内容,如果未能解决你的问题,请参考以下文章

ORA-01489 - 字符串连接的结果太长 - 附加大 Varchar 列

将 regexp_replace 连接到 listagg:结果太长(SQL 错误:ORA-01489)

执行这条SQL语句的时候报错:ORA-01489: 字符串连接的结果过长,请怎么解决 是增加字符串链接么

oracle报错解决

oracle 字符串连接的结果过长的问题怎么解决

如何通过sql的insert语句插入大量字符串到oracle的clob字段?