sql >> データベース >  >> RDS >> Oracle

PL/SQLでJSON文字列を解析するにはどうすればよいですか

    11.0.4バージョンの場合 (もちろん、11.0.4バージョンはありません)少なくとも2つの選択肢があります(自分でパーサーを作成する以外に)

    使用しているRDBMSのバージョンに応じて、次の2つのオプションがあります。

    1つ目:Oracleの場合11.1.0.7 以上の場合、Apex 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.
    

    2つ目:オープンソースの 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. C#を使用してPostgreSqlから画像を挿入および取得する方法

    2. innodbをロックするためのダミーガイド

    3. エラーメッセージを非表示にする方法

    4. フェニックスWebアプリからSSL経由でPostgreSQLに接続するにはどうすればよいですか?