我正在使用 SQL 语句的这一部分从 N:N 关系中获取信息。
目标是获得一个包含如下列的视图:“字符串 1、字符串 2、字符串 3“。这工作正常,但有时我的列中有超过 4000 字节。
(SELECT
(RTRIM(XMLAGG(xmlelement(X, TABLE1.STRING||',') order by TABLE1.STRING).extract('//text()'),','))
FROM
STRING_HAS_TABLE1
JOIN TABLE1 STRING_HAS_TABLE1.STRING_ID = TABLE1.ID
WHERE
STRING_HAS_TABLE1.USER_ID = X.ID) AS STRINGS,
Oracle 抛出“缓冲区溢出”。我认为问题出在视图内的列类型:VARCHAR2(4000)。
错误:ORA 19011 - 字符串缓冲区太小
有什么想法可以在不改变整个应用程序逻辑的情况下处理这个问题吗?
这是数据类型之间隐式转换的问题。您可以通过将其视为CLOB
在修剪之前,通过添加getClobVal()
call:
SELECT RTRIM(XMLAGG(xmlelement(X, TABLE1.STRING||',')
order by TABLE1.STRING).extract('//text()').getClobVal(),',')
FROM ...
The RTRIM文档 http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions160.htm#sthref1481显示它接受的类型,并且因为XMLTYPE
未列出,这意味着它必须进行隐式转换,显然是为了VARCHAR2
。 (同样适用于其他TRIM
功能)。
但它确实接受CLOB
,因此显式转换为CLOB
means RTRIM
不会对太小的类型进行隐式转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)