Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Pisahkan string yang dipisahkan titik koma multi kolom dan buat catatan

Anda dapat memproses parameter sebagai berikut:

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

Jika Anda hanya perlu memasukkan data yang diproses ke dalam tabel, satu-satunya insert into pernyataan dan kueri akan diperlukan (bulk collect into l_rec harus dihapus):

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.

Anda juga dapat menyisipkan seluruh catatan ke dalam tabel (jika Anda perlu melakukan pemrosesan ekstra dari elemen yang diekstraksi sebelum penyisipan) sebagai berikut:

  • Jika jumlah kolom dalam tabel sama dengan jumlah elemen yang disisipkan

    for i in l_rec.first..l_rec.last
    loop
       insert into your_table
         values l_rec(i);
    end loop;
    
  • Jika jumlah kolom dalam tabel lebih besar maka jumlah nilai yang dimasukkan

    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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Parameter default dalam prosedur Oracle

  2. ubah ukuran kolom dalam tabel yang berisi data

  3. Enkripsi di dalam oracle

  4. ORACLE Pilih Distinct mengembalikan banyak kolom dan di mana

  5. Melewati nama tabel ke kursor