【问题标题】:getting error when calling a procedure from a trigger in Oracle从 Oracle 中的触发器调用过程时出错
【发布时间】:2018-02-10 18:56:55
【问题描述】:

我有以下代码摘录,它将使用触发器和触发器调用的存储过程将数据插入三个表中。触发器和过程都已成功编译。

   CREATE OR REPLACE TRIGGER trigger_insert_attr AFTER
    INSERT ON BSCS_WORK_SYNC_INFO FOR EACH ROW BEGIN 
    bscs_rateplan_sync(:new.project_id , :new.tmcode);
   update BSCS_WORK_SYNC_INFO set comp_date=SYSDATE where 
    project_id=:new.project_id;
  END trigger_insert_attr;
  /


   CREATE OR REPLACE
  PROCEDURE bscs_rateplan_sync
  (
    tmcode_list IN VARCHAR2,
    project_id  IN VARCHAR2
  )
  AS
  BEGIN
  EXECUTE IMMEDIATE 'delete from  ecm_mpulktm1 where 
  project_id='||project_id ;
  EXECUTE IMMEDIATE 'delete from  ecm_mpulktm2 where 
  project_id='||project_id ;
  EXECUTE IMMEDIATE 'delete from  ecm_fup_tariff_work where 
  project_id='||project_id ;
  EXECUTE immediate 'insert into ecm_mpulktm1 select '||project_id||' , m1.* 
  from sysadm.mpulktm1@to_bscsprd_rpt m1 where tmcode in 
  ('||tmcode_list||')' 
   ;
  EXECUTE immediate 'insert into ecm_mpulktm2 select '||project_id||' , m1.* 
  from sysadm.mpulktm2@to_bscsprd_rpt m1 where tmcode in 
  ('||tmcode_list||')' 
  ;
  EXECUTE immediate 'insert into ecm_fup_tariff_work select '||project_id||' 
 , m1.* from sysadm.fup_tariff_work@to_bscsprd_rpt m1 where tmcode in 
 ('||tmcode_list||')' ;
  END;
  /

但是当数据被插入到表 BSCS_WORK_SYNC_INFO 中时,我得到了 以下错误:

SQL 错误:ORA-00933:SQL 命令未正确结束 ORA-06512: 在“ECMREPORT.BSCS_RATEPLAN_SYNC”,第 6 行 ORA-06512: 在“ECMREPORT.TRIGGER_INSERT_ATTR”,第 2 行 ORA-04088: 执行触发器 'ECMREPORT.TRIGGER_INSERT_ATTR' 期间出错

有人可以帮助解决错误吗?我对 PL/SQL 比较陌生,因此需要帮助来解决上述错误。表 BSCS_WORK_SYNC_INFO 中的数据将由 Web 服务填充。还有程序执行后表中要更新的数据。

【问题讨论】:

  • 请向我们展示进入触发器的:new.tmcode 的一些值。

标签: oracle stored-procedures oracle11g


【解决方案1】:

“快速而肮脏”的修复

CREATE OR REPLACE TRIGGER trigger_insert_attr
    AFTER INSERT ON BSCS_WORK_SYNC_INFO FOR EACH ROW
BEGIN
    bscs_rateplan_sync(:new.project_id, :new.tmcode);
    update bscs_work_sync_info set comp_date = SYSDATE where project_id = :new.project_id;
END trigger_insert_attr;
/

CREATE OR REPLACE
PROCEDURE bscs_rateplan_sync
    ( tmcode_list   IN VARCHAR2
    , project_id    IN VARCHAR2 )
AS
BEGIN
    delete from ecm_mpulktm1 where project_id = bscs_rateplan_sync.project_id;
    delete from ecm_mpulktm2 where project_id = bscs_rateplan_sync.project_id;
    delete from ecm_fup_tariff_work where project_id = bscs_rateplan_sync.project_id;

    execute immediate '
        insert into ecm_mpulktm1
        select :project_id, m1.*
        from sysadm.mpulktm1@to_bscsprd_rpt m1
        where tmcode in ('||nvl(bscs_rateplan_sync.tmcode_list,'null')||')'
    using in bscs_rateplan_sync.project_id;

    execute immediate '
        insert into ecm_mpulktm2
        select :project_id, m1.*
        from sysadm.mpulktm2@to_bscsprd_rpt m1
        where tmcode in ('||nvl(bscs_rateplan_sync.tmcode_list,'null')||')'
    using in bscs_rateplan_sync.project_id;

    execute immediate '
        insert into ecm_fup_tariff_work
        select :project_id, m1.*
        from sysadm.fup_tariff_work@to_bscsprd_rpt m1
        where tmcode in ('||nvl(bscs_rateplan_sync.tmcode_list,'null')||')'
    using in bscs_rateplan_sync.project_id;
END;
/

适当的修复

...会是

  • 通过将 bscs_rateplan_sync.tmcode_list 中的值列表解析为集合并将集合绑定到静态 SQL 来完全删除动态 SQL,
  • bscs_work_sync_info.comp_date 的更新移动到更新bscs_work_sync_info() 存储过程,并声明触发器以调用存储过程而不是匿名PLSQL 块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 2014-03-16
    • 1970-01-01
    • 2016-07-22
    • 2019-04-27
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多