1

如何在plsql中的FORALL之后有一个插入语句和调用过程?

我在程序中有以下内容

FORALL indx IN p_product.FIRST .. p_product.LAST
        INSERT INTO   my_table
              VALUES   (p_product(indx),p_product_desc(indx),p_msg);

在插入之后,我想调用另一个将值插入另一个表的过程。

remove_dup_products(p_product(indx));

当我试图在插入语句后调用上述过程时,我收到错误

INDX must be declared
4

1 回答 1

2

FORALL语句就是这样;一份声明; 你只能在其中做一件事。您必须再次遍历您的类型。

forall indx in p_product.first .. p_product.last
   insert into my_table
   values (p_product(indx), p_product_desc(indx), p_msg);

for indx in p_product.first .. p_product.last loop
   remove_dup_products(p_product(indx));
end loop;

不做两个 DML 语句毫无价值;你正在做一个并调用一个程序。因此,您不能使用 FORALL 两次,您必须使用常规 for 循环。

如果您在第二个过程中执行 DML,您可以传入整个集合,然后使用 FORALL。您需要声明一个全局变量:

create or replace package something is

   type t__product is table of product.product%type;
   t_product t__product;

   ...

然后你可以在任何地方重复使用它

create or replace package body something is

procedure current_proc is

begin

   forall indx in p_product.first .. p_product.last
      insert into my_table
      values (p_product(indx), p_product_desc(indx), p_msg);

   remove_dup_products(p_product);

end current_proc;

-------------------------------------------------------------

procedure remove_dup_products (p_product in t_product) is

begin

    forall in p_product.first .. p_product.last
       delete ...
于 2013-09-08T12:53:37.117 回答