对于未传递给函数的循环值

时间:2015-01-22 09:55:08

标签: sql oracle stored-procedures plsql

我在程序中有以下内容

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。

我该怎么做?

1 个答案:

答案 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的循环中的下一个值添加换行符。