Oracle将表行转换为列表

时间:2015-08-06 08:53:40

标签: oracle

我有一个单列

的表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(),以实现结果,我想要?

2 个答案:

答案 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”了解用户定义的聚合。