使用dbms_lob.substr转换和连接clob列给出' ORA-01489:字符串连接的结果太长'错误

时间:2017-05-17 16:00:26

标签: sql oracle

我写了一个查询

SELECT DISTINCT s.last_call_et,
s.sid ,
s.sql_id,
to_clob(dbms_lob.substr(sq.sql_fulltext,4000,1)) ||
to_clob(dbms_lob.substr(sq.sql_fulltext,4000,4001)) SQL_TEXT,
s.username,
s.status,
s.blocking_session,
s.BLOCKING_INSTANCE,
sq.LAST_ACTIVE_TIME,
NULL
FROM gv$session s,
    gv$sql sq
  WHERE sq.address    = s.sql_address
AND sq.hash_value   = s.SQL_HASH_VALUE
AND sq.sql_id       = s.sql_id
AND s.status        = 'ACTIVE'
AND s.last_call_et >= 500
AND s.sql_id       IS NOT NULL 
AND SQ.SQL_TEXT NOT LIKE '%$%';   

这给了我ORA-01489:字符串连接的结果太长错误可能是因为我上面查询中的SQL_TEXT列超过了4000个字符。 请建议一下。

感谢。

2 个答案:

答案 0 :(得分:0)

我认为你不能连接Clobs。试过这个,它有效,

SELECT DISTINCT s.last_call_et,
s.sid ,
s.sql_id,
dbms_lob.substr(sq.sql_fulltext,4000,1) ||
dbms_lob.substr(sq.sql_fulltext,4000,4001) SQL_TEXT,
s.username,
s.status,
s.blocking_session,
s.BLOCKING_INSTANCE,
sq.LAST_ACTIVE_TIME,
NULL
FROM gv$session s,
    gv$sql sq
  WHERE sq.address    = s.sql_address
AND sq.hash_value   = s.SQL_HASH_VALUE
AND sq.sql_id       = s.sql_id
AND s.status        = 'ACTIVE'
AND s.last_call_et >= 500
AND s.sql_id       IS NOT NULL 
AND SQ.SQL_TEXT NOT LIKE '%$%'

答案 1 :(得分:0)

原因是你使用的连接运算符('||')是在VARCHAR2上定义的,而不是在CLOBS>上定义的。因此,Oracle对VARCHAR2进行了隐式类型转换,VARCHAR2的大小限制为4000字节。 您应该使用DBMS_LOB.APPEND来连接LOB。 请参阅:http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_lob.htm#BABEAJAD