Không thực hiện lặp trong các vòng lặp trong PL / SQL cho điều này - sử dụng SQL để cung cấp cho bạn dữ liệu sẵn sàng để sử dụng.
Đầu tiên, chúng tôi tạo bảng của bạn với một số dữ liệu thử nghiệm (tôi đoán là các kiểu dữ liệu - bạn thay thế bằng loại dữ liệu của riêng mình):
create table product_master (
product_no varchar2(10)
, product_holder varchar2(10)
, product_catalogue varchar2(10)
)
/
insert into product_master values ('1', 'SMITH', 'TEMP')
/
insert into product_master values ('2', 'SMITH', 'TEMP')
/
insert into product_master values ('3', 'HARRY', 'ARCH')
/
insert into product_master values ('4', 'TOM' , 'DEPL')
/
commit
/
Những gì chúng tôi muốn gửi tới mail_send
quy trình cho từng product_holder
là một tập hợp (mảng) chứa product_no
và product_catalogue
. Vì vậy, trước tiên, một kiểu có chứa hai yếu tố đó:
create type t_prod_cat_no as object (
product_no varchar2(10)
, product_catalogue varchar2(10)
)
/
Và sau đó là một loại bảng lồng nhau (loại tập hợp) thuộc loại đó:
create type t_prod_cat_no_table as
table of t_prod_cat_no
/
Quy trình mail_send
thì phải chấp nhận product_holder
và loại bộ sưu tập:
create or replace procedure mail_send (
p_parameter in varchar2
, p_product_holder in varchar2
, p_product_cats_nos in t_prod_cat_no_table
)
is
begin
dbms_output.put_line('-- BEGIN '||p_parameter||' --');
dbms_output.put_line('Dear '||p_product_holder);
dbms_output.put_line('Your products are:');
for i in 1..p_product_cats_nos.count loop
dbms_output.put_line(
'Catalogue: '||p_product_cats_nos(i).product_catalogue||
' - No: '||p_product_cats_nos(i).product_no
);
end loop;
end mail_send;
/
(Tôi chỉ sử dụng dbms_output để mô phỏng việc tạo một thư.)
Sau đó, bạn có thể tạo nhóm group by product_holder
trong SQL và để SQL tạo tập hợp chứa dữ liệu:
begin
for holder in (
select pm.product_holder
, cast(
collect(
t_prod_cat_no(pm.product_no,pm.product_catalogue)
order by pm.product_catalogue
, pm.product_no
) as t_prod_cat_no_table
) product_cats_nos
from product_master pm
group by pm.product_holder
order by pm.product_holder
) loop
mail_send(
'PRODMASTER'
, holder.product_holder
, holder.product_cats_nos
);
end loop;
end;
/
Đầu ra của khối trên sẽ là:
-- BEGIN PRODMASTER --
Dear HARRY
Your products are:
Catalogue: ARCH - No: 3
-- BEGIN PRODMASTER --
Dear SMITH
Your products are:
Catalogue: TEMP - No: 1
Catalogue: TEMP - No: 2
-- BEGIN PRODMASTER --
Dear TOM
Your products are:
Catalogue: DEPL - No: 4
Làm điều đó trong SQL với GROUP BY
cung cấp cho bạn mọi thứ chỉ trong một lệnh gọi từ PL / SQL đến SQL, hiệu quả hơn rất nhiều so với một lệnh gọi đầu tiên để có được tập hợp riêng biệt của product_holder
, lặp lại điều đó, sau đó gọi một lệnh cho mỗi product_holder
để nhận các sản phẩm cho từng chủ sở hữu.
CẬP NHẬT:
Đã thêm order by
vào collect
trong đoạn mã trên để cho thấy bạn có quyền kiểm soát thứ tự dữ liệu được điền vào bộ sưu tập.