我正在使用 SQL 语句的这一部分从 N:N 关系中获取信息。
目标是获得一个包含如下列的 View :“STRING1,STRING2,STRING3”。这工作正常,但有时列中的字节数超过 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 抛出“缓冲区溢出”。我认为问题出在 View 内的列类型:VARCHAR2(4000)。
错误:ORA 19011 - 字符串缓冲区太小
有什么想法可以在不改变整个应用程序逻辑的情况下处理这个问题吗?
最佳答案
这是数据类型之间隐式转换的问题。您可以通过在修剪之前将其视为 CLOB
来绕过它,方法是添加 getClobVal()
调用:
SELECT RTRIM(XMLAGG(xmlelement(X, TABLE1.STRING||',')
order by TABLE1.STRING).extract('//text()').getClobVal(),',')
FROM ...
RTRIM
documentation显示它接受的类型,并且由于 XMLTYPE
未列出,这意味着它必须执行隐式转换,显然是到 VARCHAR2
。 (这同样适用于其他 TRIM
函数)。
但它确实接受 CLOB
,因此显式转换为 CLOB
意味着 RTRIM
不会隐式转换为以下类型:太小了。
关于sql - Oracle VIEW - 列中超过 4000 字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16540132/