Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

मैं पीएल/एसक्यूएल में JSON स्ट्रिंग को कैसे पार्स कर सकता हूं?

<स्ट्राइक>11.0.4 संस्करण के साथ (निश्चित रूप से कोई 11.0.4 संस्करण नहीं है)<स्ट्राइक> आपके पास कम से कम दो विकल्प हैं (स्वयं एक पार्सर लिखने के अलावा) :

आपके द्वारा उपयोग किए जा रहे RDBMS के संस्करण के आधार पर, यहां कुछ विकल्प दिए गए हैं:

पहला:Oracle के लिए 11.1.0.7 और ऊपर, एपेक्स 5 स्थापित करें और apex_json . का उपयोग करें पैकेज:

-- here I have 12.1.0.1 version with version 5 of apex installed

column ora_version format a21;
column apex_version format a21;


select (select version from v$instance) as ora_version
     , (select version_no from apex_release) as apex_version
  from dual;

--drop table test_2;
/* our test table */  
create table test_2(
  c_a date,
  c_b date,
  c_c number,
  c_d number,
  c_e number
);

select * from test_2;

declare
  l_json_doc clob; 
begin
  dbms_output.put_line('Parsing json...');
  l_json_doc := '{"a":"01/01/2015","b":"31/12/2015",
                  "c":"11111111111","d":"1111111111",
                  "e":"1234567890"}';
  apex_json.parse(l_json_doc);
  insert into test_2(c_a, c_b, c_c, c_d, c_e)
    values(apex_json.get_date(p_path=>'a', p_format=>'dd/mm/yyyy'),
           apex_json.get_date(p_path=>'b', p_format=>'dd/mm/yyyy'),
           to_number(apex_json.get_varchar2(p_path=>'c')),
           to_number(apex_json.get_varchar2(p_path=>'d')),
           to_number(apex_json.get_varchar2(p_path=>'e')));
  commit;
  dbms_output.put_line('Done!');
end;
/

column c_c format 99999999999;
select to_char(c_a, 'dd/mm/yyyy') as c_a
     , to_char(c_b, 'dd/mm/yyyy') as c_b
     , c_c
     , c_d
     , c_e 
  from test_2;

परिणाम:

ORA_VERSION           APEX_VERSION         
--------------------- ---------------------
12.1.0.1.0            5.0.2.00.07          

1 row selected.

Table created.

no rows selected.

Parsing json...
Done!
PL/SQL procedure successfully completed.


C_A        C_B                 C_C        C_D        C_E
---------- ---------- ------------ ---------- ----------
01/01/2015 31/12/2015  11111111111 1111111111 1234567890

1 row selected.

दूसरा:ओपनसोर्स PL/JSON का इस्तेमाल करें . पहले कभी इसका इस्तेमाल नहीं किया, इसलिए मैं इसे आजमाने का मौका ले रहा हूं। यह काफी हद तक apex_json . से मिलता-जुलता है ।

declare
  l_json      json;  --json object
  l_json_doc  clob;
begin
  dbms_output.put_line('Parsing json...');

  -- parsing is done upon object instantiation

  l_json_doc := '{"a":"01/01/2015","b":"31/12/2015",
                  "c":"11111111111","d":"1111111111",
                  "e":"1234567890"}';
  l_json := json(l_json_doc);


  insert into test_2(c_a, c_b, c_c, c_d, c_e)
    values(to_date(l_json.get('a').get_string, 'dd-mm-yyyy'),
           to_date(l_json.get('b').get_string, 'dd-mm-yyyy'),
           to_number(l_json.get('c').get_string),
           to_number(l_json.get('d').get_string),
           to_number(l_json.get('e').get_string));
  commit;
  dbms_output.put_line('Done!');
end;

column c_c format 99999999999;
select to_char(c_a, 'dd/mm/yyyy') as c_a
     , to_char(c_b, 'dd/mm/yyyy') as c_b
     , c_c
     , c_d
     , c_e 
  from test_2;

परिणाम:

C_A        C_B                 C_C        C_D        C_E
---------- ---------- ------------ ---------- ----------
01/01/2015 31/12/2015  11111111111 1111111111 1234567890
01/01/2015 31/12/2015  11111111111 1111111111 1234567890

2 rows selected.

json_table() . का परिचय 12.1.0.2 रिलीज में JSON को पार्स करना थोड़ा आसान हो जाता है (सिर्फ प्रदर्शन के लिए):

insert into test_2
  select to_date(c_a, 'dd-mm-yyyy')
       , to_date(c_b, 'dd-mm-yyyy')
       , c_c
       , c_d
       , c_e
    from json_table('{"a":"01/01/2015",
                      "b":"31/12/2015",
                      "c":"11111111111",
                      "d":"1111111111",
                      "e":"1234567890"}'
                    , '$' 
                    columns ( 
                       c_a varchar2(21) path '$.a',
                       c_b varchar2(21) path '$.b',
                       c_c varchar2(21) path '$.c',
                       c_d varchar2(21) path '$.d',
                       c_e varchar2(21) path '$.e'
                    )) ;

परिणाम:

 select *
   from test_2;


C_A         C_B                C_C        C_D        C_E
----------- ----------- ---------- ---------- ----------
1/1/2015    12/31/2015  1111111111 1111111111 1234567890


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-01027:बाइंड वेरिएबल्स को डेटा परिभाषा के लिए अनुमति नहीं है, जब उपयोग करने का प्रयास कर रहा है ifelif

  2. ODP.NET के साथ Windows प्रमाणीकरण का उपयोग करके Oracle से कनेक्ट नहीं हो सकता

  3. मैं Oracle में एक स्ट्रिंग से अद्वितीय वर्ण कैसे प्राप्त कर सकता हूं?

  4. आकाशवाणी। एलडीएपी के साथ प्रमाणीकरण हमेशा रिटर्न -16

  5. शालीनता की ओर जाता है:जोखिम वास्तविकता बन जाता है