Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Podziel wielokolumnowy ciąg oddzielony średnikami i utwórz rekordy

Możesz przetwarzać parametry w następujący sposób:

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

Jeśli potrzebujesz po prostu wstawić przetworzone dane do tabeli, jedyne insert into potrzebna będzie instrukcja i zapytanie (bulk collect into l_rec należy usunąć):

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.

Możesz również wstawić cały rekord do tabeli (w przypadku, gdy musisz wykonać dodatkowe przetwarzanie wyodrębnionych elementów przed wstawieniem) w następujący sposób:

  • Jeśli liczba kolumn w tabeli jest równa liczbie wstawianych elementów

    for i in l_rec.first..l_rec.last
    loop
       insert into your_table
         values l_rec(i);
    end loop;
    
  • Jeśli liczba kolumn w tabeli jest większa niż liczba wstawianych wartości

    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. Musisz usunąć Oracle Favicon

  2. używanie podzapytania zamiast nazwy tabeli

  3. Błąd iskry - Dokładność dziesiętna 39 przekracza maksymalną precyzję 38

  4. Połączenie z Oracle działa za pośrednictwem aplikacji konsolowej i nie działa za pośrednictwem usługi sieciowej

  5. Funkcja Java 6 działająca w wierszu poleceń, ale nie działająca na serwerze Oracle (AES 256)