Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tách chuỗi phân tách nhiều cột bằng dấu chấm phẩy và tạo bản ghi

Bạn có thể xử lý các thông số như sau:

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

Nếu bạn chỉ cần chèn dữ liệu đã xử lý vào bảng thì chỉ cần chèn insert into tuyên bố và truy vấn sẽ là cần thiết (bulk collect into l_rec phải được loại bỏ):

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.

Bạn cũng có thể chèn toàn bộ bản ghi vào bảng (trong trường hợp bạn cần xử lý thêm các phần tử được trích xuất trước khi chèn) như sau:

  • Nếu số cột trong bảng bằng số phần tử được chèn vào

    for i in l_rec.first..l_rec.last
    loop
       insert into your_table
         values l_rec(i);
    end loop;
    
  • Nếu số cột trong bảng lớn hơn thì số giá trị được chèn vào

    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 SQL Developer - không có ocijdbc12 trong java.library.path

  2. 2 cách để kiểm tra mức độ tương thích trong Oracle (SQLcl &SQL * Plus)

  3. Làm cách nào để lấy danh sách các tháng giữa 2 ngày nhất định bằng cách sử dụng truy vấn?

  4. truy vấn oracle với một số điều kiện lọc

  5. oracle giúp đỡ thiếu dấu phẩy