2017-03-09 5 views
0

私はOracleトリガーを作成しようとしましたが、テーブルが挿入または更新された後、Linuxホストのファイルにタッチします。Oracleトリガーコードで 'exec'を使用

ので、私はそのようなシェルスクリプトを作成します。

#!/bin/bash 
touch /export/home/oracle/shell/a.txt 

とパーミッションを変更します。

chmod +x test1.sh 

は、それから私は、SYSログインオラクルを使用して、このようなスケジューラ・ジョブを作成:

SQL> exec DBMS_SCHEDULER.CREATE_JOB(job_name=>'test1',job_type=>'EXECUTABLE',job_action=>'/export/home/oracle/shell/test1.sh'); 
PL/SQL procedure successfully completed. 

今、私はOracleトリガーを作成し、このスケジューラーのジョブを次のように呼んでいます:

CREATE OR REPLACE TRIGGER MY_OAM_LOG 
AFTER INSERT OR UPDATE ON OCS_CHARGE_OFF_AUTOMATION 
FOR EACH ROW 
BEGIN 
exec DBMS_SCHEDULER.RUN_JOB(job_name=>'test1'); 
END; 
/

が、エラー:

SQL> CREATE OR REPLACE TRIGGER MY_OAM_LOG 
    2 AFTER INSERT OR UPDATE ON OCS_CHARGE_OFF_AUTOMATION 
    3 FOR EACH ROW 
    4 BEGIN 
    5 exec DBMS_SCHEDULER.RUN_JOB(job_name=>'test1'); 
    6 END; 
    7/

Warning: Trigger created with compilation errors. 

SQL> show error 
Errors for TRIGGER MY_OAM_LOG: 

LINE/COL 
-------------------------------------------------------------------------------- 
ERROR 
-------------------------------------------------------------------------------- 
2/7 
PLS-00103: Encountered the symbol "DBMS_SCHEDULER" when expecting one of the fol 
lowing: 

    := . (@ % ; 
The symbol ":=" was substituted for "DBMS_SCHEDULER" to continue. 

私は多くのソリューションを検索してい、BU私はそれに対処しますwork.howそれらのどれもありませんPLZ?。

答えて

0

問題は、execをPL/SQLのトリガーコードの内側に使用していることです。 execはSQL * Plusコマンドです。 execを削除し、あなたのコードは、良いことがあります:PL/SQL Command Referenceから

CREATE OR REPLACE TRIGGER MY_OAM_LOG 
AFTER INSERT OR UPDATE ON OCS_CHARGE_OFF_AUTOMATION 
FOR EACH ROW 
BEGIN 
    DBMS_SCHEDULER.RUN_JOB(job_name=>'test1'); 
END; 
/

:また

EXECUTE

EXEC[UTE] statement

Executes a single PL/SQL statement. The EXECUTE command is often useful when you want to execute a PL/SQL statement that references a stored procedure.


参照:

関連する問題