Oracle 12c 无法识别 JSON 类型

Posted

技术标签:

【中文标题】Oracle 12c 无法识别 JSON 类型【英文标题】:Oracle 12c does not recognize JSON type 【发布时间】:2016-03-03 23:32:41 【问题描述】:

我正在研究在 oracle 中解析 JSON CLOB。我正在尝试检索和解析单个 JSON 元素。

我隔离的主要问题是编译器无法识别此处的 JSON 类型。但是,我可以在 po_document 字段(声明为 CLOB)中插入和访问单个 JSON 元素。这是我要访问的 JSON

 '"PONumber"             : 1600,
            "Reference"            : "ABULL-20140421",
            "Requestor"            : "Alexis Bull",
            "User"                 : "ABULL",
            "CostCenter"           : "A50",
            "ShippingInstructions" : "no such",
            "Special Instructions" : null,
            "AllowPartialShipment" : true,
            "LineItems"            : "no line"'

我只是拿了一个标准的 Pl/SQL 块来解析 JSON 对象:

    DECLARE

vCONTENT            CLOB;
v_parent_json           json;
v_json_message_list         json_list;
v_json_message_list_value   json_value;
v_parent_json_value         json_value;


BEGIN

SELECT po_document INTO vCONTENT FROM j_purchaseorder;

v_parent_json := json(vCONTENT);
v_parent_json := json(v_parent_json.get(1));

  v_json_message_list := json_list(v_parent_json.get('LineItems'));

DBMS_OUTPUT.PUT_LINE(v_json_message_list.count);

for message_loop_counter in 1 ..v_json_message_list.count loop
    v_parent_json_value := json(v_json_message_list.get(message_loop_counter)).get(1);

    DBMS_OUTPUT.PUT_LINE(v_parent_json_value.mapname);
END LOOP;

END;

编译器日志生成错误消息:Error(3,8): PLS-00201: identifier 'JSON' must be declared

v$version 的输出: Oracle Database 12c 企业版 12.1.0.2.0 - 64 位生产 PL/SQL 版本 12.1.0.2.0 - 生产

【问题讨论】:

你从哪里得到的语法?据我从文档中看到的 JSON 值是一个字符串,所以 v_parent_json 应该是 varchar2 或 CLOB。或者您是否定义了具有该名称的对象类型? 或者您正在使用(或尝试使用)PL/JSON? 是的,我正在尝试使用 PLJSON 我的理解是 PL/JSON 是一个 Oracle 标准包,但它看起来不像一个。是否有标准的 Oracle 函数来解析 JSON,或者我的选项是否限制了正则表达式字符串并为每个 JSON 元素提取元素 PL/JSON 和 12c 的原生 JSON 是两个完全不同的东西。 PL/JSON 目前不支持 12c(官方)。不过,有些用户已经成功了——github.com/pljson/pljson/issues/28#issuecomment-187628569 【参考方案1】:

我最初尝试不同的东西。我在我的问题中使用了 PL/JSON 函数,但如果我想使用 Oracle 函数,这可能是一个读取 JSON 和打印值的小演示:

declare
    l_has_data_level_co BOOLEAN  := FALSE;    -- TRUE is for R12C
    jdemo CLOB;
    l_name varchar2(2000):='';
    l_location varchar2(2000):='';
begin
    jdemo := '"PONumber"             : 1600,
            "Reference"            : "ABULL-20140421",
            "Requestor"            : "Alexis Bull",
            "User"                 : "ABULL",
            "CostCenter"           : "A50",
            "ShippingInstructions" : "no such",
            "Special Instructions" : null,
            "AllowPartialShipment" : true,
            "LineItems"            : "no line"';
    SELECT 
      json_value(jdemo, '$.PONumber'),
      json_value(jdemo, '$.Reference')
    into 
      l_name,      
      l_location
    FROM dual;
    --DBMS_OUTPUT.PUT_LINE (SYSDATE||' '||jdemo);
    DBMS_OUTPUT.PUT_LINE ('Name :'||l_name||'  Location :'||l_location);
end;

【讨论】:

以上是关于Oracle 12c 无法识别 JSON 类型的主要内容,如果未能解决你的问题,请参考以下文章

关于Oracle 12C pdb用户无法登录的问题

安装oracle12c时出现无法检测指定的位置是不是位于cfs上,怎么解决

oracle 12c dbca 无法发现 asm diskgroup

Oracle 12c - 在 REST 调用中使用动态 SQL

oracle 11g安装好后,测试提示:ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务

oracle12C 无法打开https下em转换成http