获取错误PLS-00435:不能在FORALL内部使用没有BULK In-BIND的DML语句 [英] Getting error PLS-00435: DML statement without BULK In-BIND cannot be used inside FORALL

查看:809
本文介绍了获取错误PLS-00435:不能在FORALL内部使用没有BULK In-BIND的DML语句的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我得到

错误(68,3):PLS-00435:不能在FORALL内部使用没有BULK In-BIND的DML语句.

Error(68,3): PLS-00435: DML statement without BULK In-BIND cannot be used inside FORALL.

请帮助我解决这个问题.

Please help me out with this.

我的代码是:-

create or replace  PACKAGE BODY    FIBRE_TOOLS AS

g_package_name varchar2(30):='FIBRE_TOOLS';
g_proc_name varchar2(30);   

.. .. ..

   procedure prc_purge(p_nb_month IN number default 210) is
   reqSelec VARCHAR2(4000);
   reqDELDES VARCHAR2(4000);
   reqDELINS VARCHAR2(4000);

   TYPE Curseur IS REF CURSOR;
   c_desinscription Curseur;

TYPE selREC IS RECORD (

  EMAIL     desinscription.EMAIL%type,
  IDRA      desinscription.IDRA%type,
  D_DATE    desinscription.desinscription_date%type
  );

   TYPE selTABLE IS TABLE OF selREC;
   ListeFIB selTABLE;

 BEGIN  
    reqSelec :='select EMAIL,IDRA,desinscription_date from desinscription where desinscription_date < trunc(add_months(sysdate,-'||p_nb_month||'))';

    reqDELDES := 'DELETE FROM DESINSCRIPTION WHERE EMAIL=:1 AND IRDA=:2';

    reqDELINS := 'DELETE FROM INSCRIPTION WHERE EMAIL=:1 AND IDRA=:2 AND INSCRIPTION_DATE < TRUNC(:3)';
    prc_log('Begining of purging procedure');
    open c_desinscription for reqSelec;
    LOOP
    fetch c_desinscription bulk collect into ListeFIB LIMIT 10000;
    EXIT WHEN ListeFIB.count = 0;
    FORALL i in ListeFIB.first.. ListeFIB.last
        EXECUTE IMMEDIATE reqDELDES USING  ListeFIB.EMAIL,ListeFIB.IRDA;
        EXECUTE IMMEDIATE reqDELINS USING ListeFIB.EMAIL,ListeFIB.IDRA,ListeFIB.D_DATE;
        COMMIT;
        EXIT WHEN c_desinscription%NOTFOUND;
    END LOOP;
    close c_desinscription;
    COMMIT;
    prc_log('Ending of purging procedure');
end prc_purge;
end FIBRE_TOOLS;

我正在尝试根据在条件下被选中的两列从两个表中删除数据,即nb_months.

I am trying to delete data from two tables based on the two columns getting selected on a criteria I.e. nb_months.

我认为问题在于表类型和记录类型.我很困惑该怎么做.根据我的知识记录类型,应与FORALL一起使用.请帮助我,因为这非常关键.

I think problem is with table type and record type. I am confused which way it can be done. As per my knowledge record type shall be used with FORALL. kindly help me on this, as it is very critical.

推荐答案

您正在使用带有FORALL的DML语句,但未绑定使用的集合-

You're using a DML statement with a FORALL but without binding the collection used - Oracle doesn't allow for that.

用绑定的集合替换执行立即数,应该可以工作

Replace execute immediates with the binded collection, should work

EXECUTE IMMEDIATE reqDELDES USING  ListeFIB(i).EMAIL,ListeFIB(i).IRDA;
EXECUTE IMMEDIATE reqDELINS USING ListeFIB(i).EMAIL,ListeFIB(i).IDRA,ListeFIB(i).D_DATE;

请参阅这些文章中的更多示例:

See more examples in these articles:

  • Oracle Magazine
  • Oracle Documentation

这篇关于获取错误PLS-00435:不能在FORALL内部使用没有BULK In-BIND的DML语句的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆