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.

循环中的下一个值添加换行符