2014-12-30 1 views
0

저는 Oracle XE 11g에 pljson 1.05를 설치했으며 Amazon AWS describe-instances에서 반환 된 값을 추출하는 PLSQL 함수를 작성했습니다.은 pljson에 대한 올바른 구문을 얻을 수 없습니다.

예약 ID 작업과 같은 최상위 항목에 대한 값을 얻으려고 시도하지만 json의 하위 수준에 중첩 된 값을 가져올 수 없습니다.

이 예

============ 
------------ 
{ 
"ReservationId" : "r-5a33ea1a", 
"Instances" : [{ 
"State" : { 
"Name" : "stopped" 
}, 
"InstanceId" : "i-7e02503e" 
}] 
} 
1] Instance: 
------------ 
{ 
"ReservationId" : "r-e5930ea5", 
"Instances" : [{ 
"State" : { 
"Name" : "running" 
}, 
"InstanceId" : "i-77859692" 
}] 
} 
2] Instance: 

복귀 인스턴스 ID 그다지

DECLARE 
    l_clob  CLOB; 
    obj   JSON; 
    reservations JSON_LIST; 
    l_tempobj  JSON; 
    instance  JSON; 
    L_id   VARCHAR2(20); 
    BEGIN 
     obj:= json('{ 
     "Reservations": [ 
      { 
       "ReservationId": "r-5a33ea1a", 
       "Instances": [ 
        { 
         "State": { 
          "Name": "stopped" 
         }, 
         "InstanceId": "i-7e02503e" 
        } 
       ] 
      }, 
      { 
       "ReservationId": "r-e5930ea5", 
       "Instances": [ 
        { 
         "State": { 
          "Name": "running" 
         }, 
         "InstanceId": "i-77859692" 
        } 
       ] 
      } 
     ] 
     }'); 
     reservations := json_list(obj.get('Reservations')); 
     l_tempobj := json(reservations); 
     DBMS_OUTPUT.PUT_LINE('============'); 
     FOR i IN 1 .. l_tempobj.count 
     LOOP 
     DBMS_OUTPUT.PUT_LINE('------------'); 
      instance := json(l_tempobj.get(i)); 
      instance.print; 
      l_id := json_ext.get_string(instance, 'Instances.InstanceId'); 
     DBMS_OUTPUT.PUT_LINE(i||'] Instance:'||l_id); 
    END LOOP; 
END; 

에게 반환

============ 
------------ 
{ 
"ReservationId" : "r-5a33ea1a", 
"Instances" : [{ 
"State" : { 
"Name" : "stopped" 
}, 
"InstanceId" : "i-7e02503e" 
}] 
} 
1] Instance:r-5a33ea1a 
------------ 
{ 
"ReservationId" : "r-e5930ea5", 
"Instances" : [{ 
"State" : { 
"Name" : "running" 
}, 
"InstanceId" : "i-77859692" 
}] 
} 
2] Instance:r-e5930ea5 

복귀 cutdown AWS JSON 인라인

DECLARE 
    reservations JSON_LIST; 
    l_tempobj  JSON; 
    instance  JSON; 
    L_id   VARCHAR2(20); 
    BEGIN 
     obj:= json('{ 
     "Reservations": [ 
      { 
       "ReservationId": "r-5a33ea1a", 
       "Instances": [ 
        { 
         "State": { 
          "Name": "stopped" 
         }, 
         "InstanceId": "i-7e02503e" 
        } 
       ] 
      }, 
      { 
       "ReservationId": "r-e5930ea5", 
       "Instances": [ 
        { 
         "State": { 
          "Name": "running" 
         }, 
         "InstanceId": "i-77859692" 
        } 
       ] 
      } 
     ] 
     }'); 
     reservations := json_list(obj.get('Reservations')); 
     l_tempobj := json(reservations); 
     DBMS_OUTPUT.PUT_LINE('============'); 
     FOR i IN 1 .. l_tempobj.count 
     LOOP 
     DBMS_OUTPUT.PUT_LINE('------------'); 
      instance := json(l_tempobj.get(i)); 
      instance.print; 
      l_id := json_ext.get_string(instance, 'ReservationId'); 
     DBMS_OUTPUT.PUT_LINE(i||'] Instance:'||l_id); 
    END LOOP; 
    END; 

그러나이 예를 이용하여 (작동 th에서만 변화하다 첫 번째 예제에서 두 번째 예제는 'ReservationId'를 'Instances.InstanceId'로 바꾸고 있지만 두 번째 예제에서는 함수가 성공하고 instance.print 문이 전체 json을 출력하지만이 코드는 인스턴스 ID를 l_id에 채우지 않습니다. DBMS_OUTPUT의 출력.

'InstanceId'를 사용하는 경우에도 동일한 결과 (즉, L_id에는 값 없음)가 표시됩니다.

내 가정과 예제를 읽는 것이 좋습니다. JSON PATH는 중첩 된 값에 대해 점 표기법을 사용하여 값을 선택하도록 허용해야하지만 작동하지 않는 것 같습니다. JSON_LIST를 입력 한 다음 임시 변수에 'Instances'를 추출해 보았습니다. 그런 다음 JSON_LIST에 액세스하고 거기에서 액세스했지만 작동 예제도 얻을 수 없었습니다.

도움을 주시면 감사하겠습니다. 많은 감사.

답변

1

ex8.sql을 참조하십시오. 특히, 말한다 : PL/JSON에 대한

JSON의 경로 :

  • 이 예외가 발생하지 (null을 대신 반환)
  • 배열을 탐색 할 수
  • 사용하는 점을 1 색인 json 범위를 통해.
  • 빈 문자열 path는 전체 json 객체를 반환합니다.
  • JSON 경로는 JSON 만 입력으로 사용할 수 있습니다.
  • 7 개의 get 유형이 지원됩니다. 문자열, 숫자, bool, null, json, json_list 및 date! 직접 json_ext를 사용하지 않고,

    l_id := json_ext.get_string(instance, 'Instances[1].InstanceId'); 
    

    을 또는 : [] 내부

  • 공간이 중요하지, 그러나 중요하다, 그렇지 않으면 따라서

, 당신의 경로가 있어야한다

l_id := instance.path('Instances[1].InstanceId'); 
+1

예, 문서에서이 항목을 정렬해야합니다.도움이 필요하면 github.com/pljson/pljson –

관련 문제