【问题标题】:Oracle Convert table rows to listOracle 将表行转换为列表
【发布时间】:2015-08-06 08:53:39
【问题描述】:

我有一个单列的表 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() 是否有替代方法来实现我想要的结果?

【问题讨论】:

  • 为什么类型是Column_name?为什么必须将表格行转换为列表?
  • 如果你想了解其他技术,可能想看看这个String Aggregation Techniques
  • column_name 是 varchar2,我需要将行排序为像 (row1,row2,....) 这样的列表,因为我将变量 tbl_list 传递给另一个进程,该进程接受表单中的输入列表中的

标签: oracle


【解决方案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?

【讨论】:

    【解决方案2】:

    如果您期望聚合结果超过 4000 字节?如果是这样,您可能会创建一个返回 CLOB 而不是 VARCHAR2 的用户定义聚合函数。如果您不希望结果超过 4000 字节,那么您指定聚合的方式可能有问题。

    用户自定义聚合请参考“https://oracle-base.com/articles/misc/string-aggregation-techniques”。

    【讨论】:

    • 是的,问题似乎是函数返回的结果超过 4000 字节。因为如果表的行数较少,它就可以正常工作。
    猜你喜欢
    • 2016-03-16
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 2022-11-23
    相关资源
    最近更新 更多