我使用SQL Satement的这一部分从N:N关系中获取信息。
目标是使用以下列的视图:“ 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抛出“缓冲区溢出”。我认为问题是视图中的columntype:VARCHAR2(4000)。
错误:ORA 19011 - 字符串缓冲区为小
在不改变整个应用程序逻辑的情况下处理此问题的任何想法?
答案 0 :(得分:2)
这是在数据类型之间隐式转换的问题。您可以通过添加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
不会隐式转换为太小的类型。