2

我正在使用 SQL 语句的这一部分从 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 抛出“缓冲区溢出”。我认为问题在于视图内的列类型:VARCHAR2(4000)。

错误:ORA 19011 - 字符串缓冲区过小

在不改变整个应用程序逻辑的情况下处理这个问题有什么想法吗?

4

1 回答 1

2

这是在数据类型之间隐式转换的问题。您可以通过添加调用将其视为CLOB修剪前的处理来绕过它:getClobVal()

SELECT RTRIM(XMLAGG(xmlelement(X, TABLE1.STRING||',')
    order by TABLE1.STRING).extract('//text()').getClobVal(),',')
FROM ...

RTRIM文档显示了它接受的类型,并且由于没有XMLTYPE列出,这意味着它必须进行隐式转换,显然是到VARCHAR2. (这同样适用于其他TRIM功能)。

但它确实接受CLOB了,因此对 mean 进行显式转换CLOB不会RTRIM对太小类型进行隐式转换。

于 2013-05-14T11:49:19.150 回答