For 循环值未传递给函数
For loop values not passed to a function
我的流程如下
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.
我该怎么做?
for i in 1..p_products.count loop msg_body :=
myfunc(p_products(i).product_no, p_products(i).product_catalogue);
end loop;
在您的代码中,您将 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.
循环中的下一个值添加换行符
我的流程如下
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.
我该怎么做?
for i in 1..p_products.count loop msg_body := myfunc(p_products(i).product_no, p_products(i).product_catalogue);
end loop;
在您的代码中,您将 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.