问题描述
我正在使用xmlagg函数连接带有逗号分隔值的记录。但是当列数大于300时,我收到错误
我得到以下错误
还有其他方法可以解决此错误吗?
我得到以下错误
Error starting at line : 8 in command -
select
rtrim (xmlagg (xmlelement (e, COLUMN_NAME || ',')).extract ('//text()'), ',') COLUMN_NAMES
from user_tab_columns where TABLE_NAME = 'REFCLIENT'
Error report -
ORA-19011: Character string buffer too small还有其他方法可以解决此错误吗?
专家解答
你有几个选择:
1.将max_string_size参数设置为extended
2.通过将数据提取为clob来避免隐式转换为varchar2
max_string_size
从12.1开始,您可以将SQL中的varchar2的最大长度增加到32,767。为此,您需要设置max_string_size = extended。
它不像运行alter系统那样简单。有关如何执行此操作的说明,请阅读:
https://oracle-base.com/articles/12c/extended-data-types-12cR1
Extract as clob
当然,所有使用扩展数据类型的真正做的是移动点,你击中错误。为了完全避免它,通过调用getClobVal将xmlagg的输出显式转换为clob:
或者,如果您只是想避免错误并且不需要整个字符串,则可以在12.2中使用listagg的 “on overflow truncate” 子句:
1.将max_string_size参数设置为extended
2.通过将数据提取为clob来避免隐式转换为varchar2
max_string_size
从12.1开始,您可以将SQL中的varchar2的最大长度增加到32,767。为此,您需要设置max_string_size = extended。
它不像运行alter系统那样简单。有关如何执行此操作的说明,请阅读:
https://oracle-base.com/articles/12c/extended-data-types-12cR1
Extract as clob
当然,所有使用扩展数据类型的真正做的是移动点,你击中错误。为了完全避免它,通过调用getClobVal将xmlagg的输出显式转换为clob:
select rtrim(
xmlagg(
xmlelement( e,column_name || ',' )
).extract( '//text()').getClobVal(),
','
) column_names
from user_tab_columns;
COLUMN_NAMES
DOC,CITY,OLYMPIC_YEAR,SPORT,DISCIPLINE,ATHLETE,NOC,GENDER,EVENT,EVENT_GENDER,...或者,如果您只是想避免错误并且不需要整个字符串,则可以在12.2中使用listagg的 “on overflow truncate” 子句:
select listagg(column_name, ',' on overflow truncate)
within group (order by table_name, column_id) cols
from user_tab_columns;
COLS
ID,JUNK,ID,I,A,B,ID,NAME,TOY_ID,TOY_NAME,COLOUR,IS_DELETED,QUEUE,MSG_ID,... 「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




