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

複数列のセミコロンで区切られた文字列を分割し、レコードを作成します

    次のようにパラメータを処理できます:

    SQL> declare
      2    type l_rec_type is record(
      3      r_ReqIDs  varchar2(31),
      4      r_ItemIDs varchar2(31),
      5      r_Qtys    varchar2(31)
      6    );
      7  
      8    type l_rec_list is table of l_rec_type;
      9    -- your parameters. 
     10    l_ReqIDs  constant varchar2(31) := '56;56;56;';
     11    l_ItemIDs constant varchar2(31) := '3;2;1;';
     12    l_Qtys    constant varchar2(31) := '400;300;200;';
     13  
     14    l_rec l_rec_list;
     15  begin
     16  
     17  with Parameters(param) as(
     18      select l_ReqIDs  from dual union all
     19      select l_ItemIDs from dual union all
     20      select l_Qtys    from dual
     21    ),
     22    Occurrences(oc) as(
     23      select level
     24        from ( select max(regexp_count(param, '[^;]+')) moc
     25                 from parameters) s
     26     connect by level <= s.moc
     27    )
     28  select max(res1)
     29       , max(res2)
     30       , max(res3)
     31    bulk collect into l_rec
     32    from (select decode(param, l_ReqIDs, res) res1
     33               , decode(param, l_ItemIDs,res) res2
     34               , decode(param, l_Qtys,   res) res3
     35               , rn
     36            from ( select param, regexp_substr(param, '[^;]+', 1, o.oc) res
     37                        , row_number() over(partition by param order by param) rn
     38                     from parameters p
     39                    cross join occurrences o
     40                  )
     41          )
     42  group by rn;
     43  
     44    for i in l_rec.first..l_rec.last
     45    loop
     46       dbms_output.put_line(l_rec(i).r_ReqIDs || '  ' || l_rec(i).r_ItemIDs || '  ' || l_rec(i).r_Qtys);
     47    end loop;
     48  end;
     49  /
    
    
    
    56   2   200
    56   1   300
    56   3   400
    
    PL/SQL procedure successfully completed
    

    処理されたデータをテーブルに挿入する必要がある場合は、insert intoのみ ステートメントとクエリが必要になります(bulk collect into l_rec 削除する必要があります):

    insert into your_table(<<columns>>)
      with Parameters(param) as(
         select l_ReqIDs  from dual union all
         select l_ItemIDs from dual union all
         select l_Qtys    from dual
      .... 
      -- the rest of the query from the above pl/sql block.
    

    次のように、レコード全体をテーブルに挿入することもできます(挿入前に抽出された要素の追加処理を行う必要がある場合)。

    • テーブルの列数が挿入される要素の数と等しい場合

      for i in l_rec.first..l_rec.last
      loop
         insert into your_table
           values l_rec(i);
      end loop;
      
    • テーブルの列数が挿入されている値の数よりも多い場合

      for i in l_rec.first..l_rec.last
      loop
         insert into (select column1, .. ,columnn from your_table)
           values l_rec(i);
      end loop;
      


    1. スプリングデータJPA--mysql--findAll()が前に呼び出されない限り、findById()は空です

    2. JSONキーのpostgres更新ステートメントで値をインクリメントする方法

    3. mysqlを介してワードプレスのすべてのカテゴリのすべての投稿を取得するにはどうすればよいですか?

    4. 並行トランザクションでの更新の喪失の問題