我有一个单列
的表A. **TableA**
Row1
Row2
Row3
.....
我必须将表行转换为列表并将它们存储在变量中。因此它们存储为
Row1,Row2,Row3,....,Rown
我使用listagg()函数来实现解决方案。
DECLARE
tbl_list CLOB;
BEGIN
SELECT listagg (''''||Column_name||'''',',') WITHIN GROUP (ORDER BY Column_name) INTO TBL_LIST FROM TableA;
END;
如果TableA有很少的行,这可以正常工作。但是如果表有很多行,我会收到以下错误
ORA-01489: result of string concatenation is too long
这是由于变量TBL_LIST的存储限制吗?任何人都可以解释我的错误。是否有替代lisagg(),以实现结果,我想要?
答案 0 :(得分:1)
listagg
函数限制为4000个字符,如果超过4000个字符,则可能会收到错误ORA-01489: result of string concatenation is too long
您可以使用XMLAGG
,但不限于4000个字符。
SELECT
RTRIM(XMLAGG(XMLELEMENT(E,''''||Column_name||'''',',').EXTRACT('//text()')
ORDER BY Column_name).GetClobVal(),',')
from TableA;
您可以参考此问题:How to tweak LISTAGG to support more than 4000 character in select query?
答案 1 :(得分:0)
如果您希望聚合结果超过4000个字节?如果是这样,您可能会创建一个用户定义的聚合函数,该函数返回CLOB而不是VARCHAR2。如果您不希望结果超过4000个字节,那么您指定聚合的方式可能有问题。
请参阅“https://oracle-base.com/articles/misc/string-aggregation-techniques”了解用户定义的聚合。