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;