Oracle SQL - ORA-40478 - 在 CLOB 中返回大 json

问题描述 投票:0回答:1

我想知道我在执行中做错了什么,我创建了一个包来构建动态查询,但当我测试特定表时,我将包生成的查询直接传递给

CLOB
变量。

上下文:此查询以 JSON 结构返回表值,当我执行时:

EXECUTE IMMEDIATE v_query
。这通常适用于其他表,但对于我正在测试的表,它会返回一个长度超过 33k 个字符的 JSON,这会返回此错误:
ORA-40478: output value too large (maximum: 4000)
,但我使用像
CLOB
这样的变量,应该假设超过4000个。

当查询是 CLOB 时,我执行查询并将其传递给输出变量的方式是否有问题?因为

v_query
中生成的查询没有超出
VARCHAR2
的限制,唯一改变的是最后在 WHERE 子句中传递的“ROWID”,所以我想问题出在 return (这将是生成的 JSON)。

PL/SQL:

DECLARE
    v_query CLOB;
    o_return CLOB;
BEGIN
    v_query := 'SELECT JSON_SERIALIZE(JSON_OBJECT(...
    WHERE rowid = ''AAAgDXAAMAAAIL9AAN''';

    EXECUTE IMMEDIATE v_query INTO o_return;

    htp.p(o_return);
END;

v_query
中的查询已配置为返回
CLOB
。类似这样的东西:

SELECT JSON_SERIALIZE( JSON_OBJECT(
    'surname' : column_X,
    'surname' : ( SELECT JSON_ARRAYAGG ( JSON_OBJECT(
    'surname' : column_Y
    ) ABSENT ON NULL RETURNING CLOB) as data 
    FROM table_Y
    WHERE column_Y = column_X), [...] 
    .
    .-- rest of the query
    .
    [...]) RETURNING CLOB ) RETURNING CLOB PRETTY ) as data
FROM table_X
WHERE rowid = 'AAAgDXAAMAAAIL9AAN';
sql oracle oracle-sqldeveloper oracle-apex
1个回答
0
投票

在 Oracle 中使用 JSON 对象存在一些限制。该问题可能是由代码中的 JSON 函数引起的,该函数必须处理超出最大大小的对象。
来自文档:
Oracle 数据库 JSON 限制 此处列出了与 Oracle 数据库中的 Oracle 支持 JSON 数据相关的限制。

除非另有说明,如果不遵守指定的限制,则会引发错误。

一般

JSON 对象或数组的嵌套级别数:最大 1000。

JSON 字段名称长度:最大 32767 字节。

SQL/JSON 函数
返回值长度:最大32767字节
.

路径长度:最大4K字节。

路径步数:最大65535。

简化的 JSON 语法(点表示法)

路径长度:最大4K字节。

路径组件长度:最大 128 字节。

查询返回值:4K字节,最大(即使数据库参数max_string_size的值被扩展)。

JSON 搜索索引

字段名称长度:最大 255 字节。如果文档的字段名称超过 255 个字节,则可能无法完全为其建立索引。在这种情况下,数据库视图 CTX_USER_INDEX_ERRORS 中会记录错误。

更多相关信息 --> 在此处输入链接描述

© www.soinside.com 2019 - 2024. All rights reserved.