我在程序中有以下内容
create or replace procedure test_proc (
p_product_holder varchar2,
p_products type_products -- this in type of nested table with parameters of product_no and product_catalogue
)
AS
msg_body VARCHAR2 (32767);
begin
for i in 1..p_products.count loop
msg_body :=
myfunc(p_products(i).product_no, p_products(i).product_catalogue);
end loop;
procedure_mail (
msg_from => 'PRODMASTER',
msg_to => p_product_holder,
msg_subject => 'Test',
body_msg => msg_body);
end;
/
上述程序以
执行for holder in (
select pm.product_holder
, cast(
collect(
product_table(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
test_proc(
holder.product_holder,
holder.product_cats_nos
);
end loop;
我在test_proc中遇到的问题只是将for循环中的最后一个值传递给msg_body。理想情况下,希望将循环中的所有值传递给msg_body。
我该怎么做?
答案 0 :(得分:2)
for i in 1..p_products.count loop msg_body:= myfunc(p_products(i).product_no,p_products(i).product_catalogue);
结束循环;
在您的代码中,您将msg_body值传递给循环外的过程,因此,msg_body变量将仅存储从循环中获取的最后一个值。如果你在循环中移动procedure_mail,你将能够循环遍历msg_body的所有值。
将代码修改为 -
for i in 1..p_products.count loop
msg_body :=
myfunc(p_products(i).product_no, p_products(i).product_catalogue);
procedure_mail (
msg_from => 'PRODMASTER',
msg_to => p_product_holder,
msg_subject => 'Test',
body_msg => msg_body);
end loop; -- see this end loop encloses the procedure_mail
更新
你可以在循环中附加msg_body的所有值, -
for i in 1..p_products.count loop
msg_body := msg_body || chr(10) ||
myfunc(p_products(i).product_no, p_products(i).product_catalogue);
end loop;
procedure_mail (
msg_from => 'PRODMASTER',
msg_to => p_product_holder,
msg_subject => 'Test',
body_msg => msg_body);
chr(10)
会为msg_body的循环中的下一个值添加换行符。