【问题标题】:Having insert statement and procedure after FORALL在 FORALL 之后有插入语句和过程
【发布时间】:2013-09-12 02:07:25
【问题描述】:

如何在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

【问题讨论】:

    标签: oracle plsql oracle10g forall


    【解决方案1】:

    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 ...
    

    【讨论】:

    • Ben 这样做会导致 plsql 到 sql 切换吗?
    • 这取决于你在你的过程中做什么@Polppan;如果您可以将发生在该过程中的内容移动到您正在执行的 INSERT 语句中,那会更好。
    • remove_dup_products 过程中,我正在从三个表中删除product_id。所以它不是在过程中插入语句。
    • 只要是 DML,那么@Polppan 就是一回事。不过,我已经用另一个选项更新了我的答案。
    • @Polppan 无论您使用什么,FORALL 语句或常规FOR LOOP 语句,都会发生上下文切换,问题是多久一次?在FORALL 语句的情况下,当它向SQL 引擎批量发送DML 语句时,它将发生一次,而FOR LOOP 语句,因为它一次向SQL 引擎发送DML 语句,将导致上下文切换每次迭代。
    猜你喜欢
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多