sql - Oracle VIEW - 列中超过 4000 字节

标签 sql oracle

我正在使用 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/

相关文章:

java - 通过 Java 运行 Oracle Sql 脚本

sql - 创建 oracle 查询的问题

python - Pynotify 不工作 Jython

php - 从 * 表名中选择 *

php - 选择表中具有同一表中不同列的值的条件的行

SQL DELETE 语句解释

java - 应用结果集的获取大小会终止程序

oracle - ORA-00119 : invalid specification ORA-00132: syntax error

mysql - 使用 MySql 用户变量的分歧

sql - 抓取表格中的所有行并抓取条件为