在 oracle "STRING concatenation too long" 中使用 listagg 时出错
Error while using listagg in oracle "STRING concatenation too long"
我有一个 table 像 temp_a 有:
acc ai_tab where
A B QQQQ
A B RRRR
C D SSSS
C D TTTT
列 where
存储的字符串太大。所以,我的预期输出是
acc ai_tab where
A B QQQQ RRRR
C D SSSS TTTT
我尝试使用以下方法实现此目的:
select acc,ai_tab,LISTAGG(WHERE,'') WITHIN GROUP ORDER BY (acc) "where_cond2" from temp_a
group by acc,ai_tab;
我得到的错误是:
ORA-01489 :result of string concatenation is too long.
我搜索了这个类似的问题,它说也使用 XMLCLOB 但它不起作用?我们可以使用函数来获取它还是有任何其他方法?
这是一个显示您可能会使用的两个选项的示例;由于 listagg
失败,请尝试 xmlagg
。
SQL> SELECT RTRIM (
2 XMLAGG (XMLELEMENT (e, ename || ' ') ORDER BY empno).EXTRACT (
3 '//text()'),
4 ', ')
5 employees_1,
6 --
7 LISTAGG (ename, ' ') WITHIN GROUP (ORDER BY empno) employees_2
8 FROM emp
9 WHERE deptno = 10;
EMPLOYEES_1 EMPLOYEES_2
------------------------------ ------------------------------
CLARK KING MILLER CLARK KING MILLER
SQL>
同意Littlefoot 的解决方案。
或者,您也许可以编写自己的函数。我在下面包含了一个示例。
注意:我还没有用你的数据测试过这个,所以不确定它的表现如何
SQL> create table foo as
select 'A' acc, 'B' ai_tab, 'QQQQ' where_column from dual union all
select 'A','B','RRRR' from dual union all
select 'C','D','SSSS' from dual union all
select 'C','D','TTTT' from dual;
Table created.
SQL> select * from foo;
ACC AI_TAB WHERE_COLUMN
-- -- ----
A B QQQQ
A B RRRR
C D SSSS
C D TTTT
SQL> create or replace function str_concat (
p_acc in foo.acc%type,
p_ai_tab in foo.ai_tab%type
)
return clob
is
l_concat clob;
begin
for o in (
select where_column from foo where acc = p_acc and ai_tab = p_ai_tab
) loop
l_concat := l_concat || ' ' || o.where_column;
end loop;
return ltrim(l_concat, ' ');
end;
/
Function created.
SQL> select acc, ai_tab, where_column from (
select acc, ai_tab, str_concat(acc, ai_tab) where_column, row_number() over (partition by acc, ai_tab order by null)
) where rn = 1;
ACC AI_TAB WHERE_COLUMN
-- -- ----
A B QQQQ RRRR
C D SSSS TTTT
我有一个 table 像 temp_a 有:
acc ai_tab where
A B QQQQ
A B RRRR
C D SSSS
C D TTTT
列 where
存储的字符串太大。所以,我的预期输出是
acc ai_tab where
A B QQQQ RRRR
C D SSSS TTTT
我尝试使用以下方法实现此目的:
select acc,ai_tab,LISTAGG(WHERE,'') WITHIN GROUP ORDER BY (acc) "where_cond2" from temp_a
group by acc,ai_tab;
我得到的错误是:
ORA-01489 :result of string concatenation is too long.
我搜索了这个类似的问题,它说也使用 XMLCLOB 但它不起作用?我们可以使用函数来获取它还是有任何其他方法?
这是一个显示您可能会使用的两个选项的示例;由于 listagg
失败,请尝试 xmlagg
。
SQL> SELECT RTRIM (
2 XMLAGG (XMLELEMENT (e, ename || ' ') ORDER BY empno).EXTRACT (
3 '//text()'),
4 ', ')
5 employees_1,
6 --
7 LISTAGG (ename, ' ') WITHIN GROUP (ORDER BY empno) employees_2
8 FROM emp
9 WHERE deptno = 10;
EMPLOYEES_1 EMPLOYEES_2
------------------------------ ------------------------------
CLARK KING MILLER CLARK KING MILLER
SQL>
同意Littlefoot 的解决方案。 或者,您也许可以编写自己的函数。我在下面包含了一个示例。 注意:我还没有用你的数据测试过这个,所以不确定它的表现如何
SQL> create table foo as
select 'A' acc, 'B' ai_tab, 'QQQQ' where_column from dual union all
select 'A','B','RRRR' from dual union all
select 'C','D','SSSS' from dual union all
select 'C','D','TTTT' from dual;
Table created.
SQL> select * from foo;
ACC AI_TAB WHERE_COLUMN
-- -- ----
A B QQQQ
A B RRRR
C D SSSS
C D TTTT
SQL> create or replace function str_concat (
p_acc in foo.acc%type,
p_ai_tab in foo.ai_tab%type
)
return clob
is
l_concat clob;
begin
for o in (
select where_column from foo where acc = p_acc and ai_tab = p_ai_tab
) loop
l_concat := l_concat || ' ' || o.where_column;
end loop;
return ltrim(l_concat, ' ');
end;
/
Function created.
SQL> select acc, ai_tab, where_column from (
select acc, ai_tab, str_concat(acc, ai_tab) where_column, row_number() over (partition by acc, ai_tab order by null)
) where rn = 1;
ACC AI_TAB WHERE_COLUMN
-- -- ----
A B QQQQ RRRR
C D SSSS TTTT