1

JOB SCHEDULERのjob_actionには、次のSQLがあります

'BEGIN
       ALTER TRIGGER AFTERIUDSETTLEMENTS DISABLE;
       ALTER TRIGGER AFTERIUDLIQUIDATIONSDETAILS DISABLE;
       UPDATE APPOINTSOFCAS A SET INLD = (SELECT COUNT(*) FROM LIQUIDATIONSDETAILS LD WHERE A.CUSTOMERID = LD.CUSTOMERID AND A.ID = LD.APPOINTOFCAID AND A.KINDCONTROLID = LD.KINDCONTROLID);
       UPDATE APPOINTSOFCAS A SET INSD = (SELECT COUNT(*) FROM SETTLEMENTS S WHERE A.CUSTOMERID = S.CUSTOMERID AND A.ID = S.APPOINTOFCAID AND A.KINDCONTROLID = S.KINDCONTROLID);
COMMIT;
       ALTER TRIGGER AFTERIUDSETTLEMENTS ENABLE;
       ALTER TRIGGER AFTERIUDLIQUIDATIONSDETAILS ENABLE;                            
END;'

しかし、実行後、ジョブは次のエラーで失敗しました:

ORA-06550: γραμμή 2, στήλη 29:

PLS-00103: 次のいずれかを想定しているときに、記号"ALTER"が検出されました:

 begin case declare exit for goto if loop mod null pragma raise return select update while with <an identifier>
 <a double-quoted delimited-identifier> <a bind variable> <<
 συνέχεια close current delete fetch lock insert open
 rollback savepoint set sql execute commit forall merge pipe
οριστική διαγραφή

JOB SCHEDULER でトリガーを無効または有効にすることは可能ですか?

4

1 に答える 1

3

ALTER ステートメントは DDL です。つまり、 EXECUTE IMMEDIATEを使用せずに PL/SQL ブロックのスコープ内で実行することはできません。

これはかなり珍しいことです。つまり、すべてのセッションでトリガーが無効になっているため、何か他のことが起こった場合、変更はトリガーされません。可能ですが、これは間違っていると感じています。

1 つのステートメント内で 2 つの更新を行うこともできます。これはより効率的です。

begin

   execute immediate 'alter trigger afteriudsettlements disable';
   execute immediate 'alter trigger afteriudliquidationsdetails disable';

   update appointsofcas a 
      set inld = ( select count(*) 
                     from liquidationsdetails ld 
                    where a.customerid = ld.customerid 
                      and a.id = ld.appointofcaid 
                      and a.kindcontrolid = ld.kindcontrolid )
        , insd = ( select count(*) 
                     from settlements s 
                    where a.customerid = s.customerid 
                      and a.id = s.appointofcaid 
                      and a.kindcontrolid = s.kindcontrolid );

   commit;

   execute immediate 'alter trigger afteriudsettlements enable';
   execute immediate 'alter trigger afteriudliquidationsdetails enable';

end;
/
于 2013-09-18T07:40:58.377 に答える