2017-09-01 17 views
0

トリガーとトリガーによって呼び出されるストアード・プロシージャーを使用して3つの表にデータを挿入する以下のコード抜粋があります。トリガとプロシージャの両方が正常にコンパイルされています。Oracleのトリガーからプロシージャーを呼び出すときにエラーが発生する

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 [email protected]_bscsprd_rpt m1 where tmcode in 
    ('||tmcode_list||')' 
    ; 
    EXECUTE immediate 'insert into ecm_mpulktm2 select '||project_id||' , m1.* 
    from [email protected]_bscsprd_rpt m1 where tmcode in 
    ('||tmcode_list||')' 
    ; 
    EXECUTE immediate 'insert into ecm_fup_tariff_work select '||project_id||' 
, m1.* from [email protected]_bscsprd_rpt m1 where tmcode in 
('||tmcode_list||')' ; 
    END; 
/

しかし、データがテーブルBSCS_WORK_SYNC_INFOに挿入されている間、私は 以下のエラー取得しています:誰かがエラーを解決するために助けることができる

SQL Error: ORA-00933: SQL command not properly ended ORA-06512: at "ECMREPORT.BSCS_RATEPLAN_SYNC", line 6 ORA-06512: at "ECMREPORT.TRIGGER_INSERT_ATTR", line 2 ORA-04088: error during execution of trigger 'ECMREPORT.TRIGGER_INSERT_ATTR'

を?私はPL/SQLには比較的新しいので、上記のエラーを解決するための助けを求めるでしょう。テーブルBSCS_WORK_SYNC_INFOのデータは、Webサービスによって生成されます。また、手順の後にテーブル内の更新されるデータも実行されます。

+0

「:new.tmcode」の値をトリガーに表示してください。 – nop77svk

答えて

0

"間に合わせ" 修正

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 [email protected]_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 [email protected]_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 [email protected]_bscsprd_rpt m1 
     where tmcode in ('||nvl(bscs_rateplan_sync.tmcode_list,'null')||')' 
    using in bscs_rateplan_sync.project_id; 
END; 
/

適切な修正が

...

  • はリストを解析することにより、動的SQLを完全に取り除くことであろうbscs_rateplan_sync.tmcode_listの値をコレクションに追加し、そのコレクションを静的SQLにバインドします。
  • bscs_work_sync_info.comp_dateの更新をbscs_work_sync_info()ストアドprocに移動し、匿名PLSQLブロックの代わりにストアドプロシージャを呼び出すトリガーを宣言するようにします。
関連する問題