如何使用 Oracle 12C JSON_VALUE 提取大于 4000 字节的 json 值?

Mat*_*sen 6 oracle json oracle12c

我有一个带有 CLOB 的表,其中存储了一个大的 JSON 有效负载。但是,我无法选择值大于 4000 字节的某些属性。

例如,以这样的 json 为例:

{
    "foo": "some string smaller than 4k",
    "bar": "some string larger than 4k"
}
Run Code Online (Sandbox Code Playgroud)

以下工作:

SELECT json_value(j, '$.foo' ERROR ON ERROR) FROM j;
Run Code Online (Sandbox Code Playgroud)

以下失败ORA-40478: output value too large (maximum:)

SELECT json_value(j, '$.bar' ERROR ON ERROR) FROM j;
Run Code Online (Sandbox Code Playgroud)

这个 12CR1 文档

ORA-40478: 输出值太大(最大值:字符串)

原因:提供的 JavaScript 对象表示法 (JSON) 运算符生成的结果超出了 RETURN 子句中指定的最大长度。

行动:增加返回子句中数据类型的最大大小或在返回子句中使用CLOB或BLOB。

但是,使用该RETURNING子句也会失败,例如ORA-40444: JSON processing error

SELECT json_value(j, '$.bar' RETURNING CLOB ERROR ON ERROR) FROM j;
Run Code Online (Sandbox Code Playgroud)

它在 PLSQL 期间也会失败

DECLARE
    val CLOB;
BEGIN
    SELECT json_value(j, '$.bar' RETURNING CLOB ERROR ON ERROR) 
        INTO val 
    FROM j
 END;
Run Code Online (Sandbox Code Playgroud)

小智 4

默认情况下,Json_value 函数将返回 varchar2(4000),但如果添加指定 varchar2 大小的返回子句,则可以强制它返回更长的值。

在您的示例中,以下查询应该有效:

SELECT json_value(j, '$.bar'  returning varchar2(32000) ERROR ON ERROR) FROM j;
Run Code Online (Sandbox Code Playgroud)

附言。在 Oracle 12c (SQL) 中,varchar2 限制为 4000 字节,除非将 MAX_STRING_SIZE 参数设置为 EXTENDED。

如果 MAX_STRING_SIZE = EXTENDED,则为 32767 个字节或字符