Oracle
 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Бърз начин за генериране на конкатенирани низове в Oracle

  2. rs.last() дава невалидна операция само за препращане на резултати:last

  3. Помощ за изчисляване на сложна сума в йерархичен набор от данни

  4. Оракул с подзаявка

  5. Използване на distinct в XMLAGG при дублиращи се записи