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)