2017-03-09 1 views
0

오라클 트리거를 만들려고했는데 테이블이 삽입 또는 업데이트 된 후에 Linux 호스트에서 파일을 터치합니다.오라클 트리거 코드에서 'exec'사용

그래서 그런 쉘 스크립트 작성 :

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

및 권한 수정 : 내가 SYS 로그인 오라클을 사용하고이 같은 스케줄러 작업 생성 후

chmod +x test1.sh 

을 :

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

문제는 PL/SQL 인 트리거 코드 내에 exec을 사용하고 있다는 것입니다. 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.


참조 :