Sql 使用dbms#u lob.substr转换和连接clob列会得到';ORA-01489:字符串串联的结果太长';错误
我已经写下了一个问题Sql 使用dbms#u lob.substr转换和连接clob列会得到';ORA-01489:字符串串联的结果太长';错误,sql,oracle,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_ACTI
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_文本列超过4000个字符。
请给我建议一条路
谢谢。我认为您无法连接CLOB。试过这个,它成功了
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 '%$%'
原因是您使用的连接运算符(“| |”)是在VARCHAR2上定义的,而不是在CLOBS>上定义的。因此,Oracle对VARCHAR2执行隐式类型转换,其大小限制为4000字节。 应该使用DBMS_LOB.APPEND来连接LOB。
请参阅:谢谢您的回复。我在DBMS_LOB.APPEND(DBMS_LOB.substr(sq.sql_fulltext,4000,1),DBMS_LOB.substr(sq.sql_fulltext,40004001))sql_TEXT上面的查询中尝试了这一点,但它给了我一个错误,说-DBMS_LOB“。“APPEND”:无效标识符我是以错误的方式使用它还是什么?