在 Oracle 12c 的 JSON_VALUE 中使用特殊字符的问题

Posted

技术标签:

【中文标题】在 Oracle 12c 的 JSON_VALUE 中使用特殊字符的问题【英文标题】:Issue with using special character in JSON_VALUE of Oracle 12c 【发布时间】:2017-01-04 17:57:26 【问题描述】:

我在 Oracle 12c 上运行以下代码:

DECLARE
           l_json clob;
           l_var varchar2(90);
BEGIN
           l_json := '
                      "value>50": 
                        "id": "file",
                        "value": "55",
                        "popup": 
                          "menuitem": [
                            "value": "New",
                            "onclick": "CreateNewDoc()"
                          ,
                          
                            "value": "Open",
                            "onclick": "OpenDoc()"
                          ,
                          
                            "value": "Close",
                            "onclick": "CloseDoc()"
                          ]
                        
                      
                    ';

    SELECT JSON_VALUE(l_json, '$.value>50.value') INTO l_var FROM dual;
    DBMS_OUTPUT.PUT_LINE('var: '||l_var);
END;

运行时出现以下错误:

错误报告 - ORA-06550:第 17 行,第 47 列: PL/SQL:ORA-40442:JSON 路径表达式语法错误 ORA-06550:第 17 行,第 1 列: PL/SQL:忽略 SQL 语句 06550. 00000 - “第 %s 行,第 %s 列:\n%s” *原因:通常是 PL/SQL 编译错误。 *行动:

我期望结果为: 变量:55 有没有办法在 JSON_VALUE 中使用特殊字符?

【问题讨论】:

@AlexPoole 不,我指的是特殊字符:'>' 并且 json 路径将是 '$.value>50.value' 来访问值:55。因为,'value>50 ' 是键之一,因此在我的 json 路径中使用它。 啊,我明白了,误读了。不过,在问题中澄清这一点可能很有用。 虽然,from the same doc:密钥必须以大写或小写字母 A 到 Z 开头,并且只包含这些字母或十进制数字 (0-9),否则必须用双引号括起来标记 (")。'$."value>50".value 也有效吗? 加引号(")后完美运行 @AlexPoole,在 JSON_VALUE 中传递的 JSON 的长度是否也有限制?在我原来的问题中,我传递了 11000 个字符的 JSON,它没有为我获取结果。 【参考方案1】:

The documentation says:

对象步骤是一个句点 (.),有时读作“点”,后跟一个对象键(对象属性名称)或星号 (*) 通配符,代表(的值)所有的钥匙。密钥必须以大写或小写字母 A 到 Z 开头,并且仅包含此类字母或十进制数字 (0-9),否则必须用双引号 (") 括起来。

因此,由于您的密钥包含字符 >,这不是列出的允许的字符之一,因此您需要通过将 JSON 路径更改为来引用它:

SELECT JSON_VALUE(l_json, '$."value>50".value') INTO l_var FROM dual;

【讨论】:

以上是关于在 Oracle 12c 的 JSON_VALUE 中使用特殊字符的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Oracle 的 JSON_VALUE 函数与 PreparedStatement 一起使用

多个节点同名时使用 Oracle SQL 获取 JSON_VALUE

MySql 5.7对json_table()函数的一次变通替代

oracle 11g 和 12c 有啥区别?

oracle11g和12c有啥区别?

从 oracle 12c 升级到 oracle 19c 导致查询性能下降