我正在尝试使用动态 SQL 将不同的列值转换为 Oracle SQL Developer 中的列,有超过 400 个且每个单词平均包含 50 个字符的不同列值,我使用 clob 作为数据类型来存储连接值,但我最终出现此错误:
ORA-01489 字符串连接结果太长
我尝试了
listagg
和 xmlagg
并将结果存储到 clob
变量中,但问题仍然存在。
这是示例代码:
declare
v_clob_data clob;
dynamic_sql clob;
begin
v_clob_data := empty_clob();
select
listagg(''''||category_name||''''||' as "'||category_name||'"',',') within group (order by category_name)
into v_clob_data
from (select distinct categories as category_name from my_table);
dynamic_sql :='
select * from
(
select
id,
categories
from my_table
)
pivot(
count(categories) for categories in ('||v_clob_data||')
)';
execute immediate dynamic_sql;
end;
my_table
看起来像这样:
id | 类别 |
---|---|
1 | A |
1 | A |
1 | B |
1 | B |
1 | B |
1 | C |
1 | C |
2 | B |
2 | B |
3 | A |
这是预期的结果:
id | A | B | C |
---|---|---|---|
1 | 2 | 3 | 2 |
2 | 0 | 2 | 0 |
3 | 1 | 0 | 0 |
请记住,
categories
列的每个值平均有 50 个字符,并且有超过 400 个值(可以增加或减少)。因此动态SQL是必要的。请帮忙
从这个帖子
得到了答案我在使用 xmlagg 语法时遇到了问题。参考上面的链接解决了。