2016-03-03 369 views
0

我正在解析Oracle中的JSON CLOB。我试图检索和解析单个JSON元素。Oracle 12c不能识别JSON类型

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

'{"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对象的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; 

编译器日志生成错误消息:错误(3, 8):PLS-00201:标识符 'JSON' 必须声明

从v $版本输出: Oracle数据库12c的企业版发行12.1.0.2.0 - 64位生产 PL/SQL发布12.1.0.2.0 - 生产

+1

你从哪儿得到这种语法?据我从文档中看到的JSON值是一个字符串,所以v_parent_json应该是一个varchar2或一个CLOB。或者你是否定义了一个具有该名称的对象类型? –

+0

或者你正在使用(或尝试使用)[PL/JSON](https://github.com/pljson/pljson/)? –

+0

是的,我正在尝试使用PLJSON – Abhi

回答

0

我最初尝试的是不同的事情。我使用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;