我尝试创建Oracle触发器,在表插入或更新后,触摸Linux主机中的文件。
所以我创建了一个像这样的shell脚本:
#!/bin/bash
touch /export/home/oracle/shell/a.txt
并修改权限:
chmod +x test1.sh
然后我使用sys登录oracle并创建一个这样的调度程序作业:
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.
我已经搜索了很多解决方案,但是没有一个是work.h我可以处理吗?PLZ。
答案 0 :(得分:0)
问题是您在触发器代码PL / SQL中使用exec
。 exec
是一个SQL * Plus命令。删除exec
,您的代码应该是好的:
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]声明
执行单个PL / SQL语句。 EXECUTE命令经常出现 当您想要执行引用a的PL / SQL语句时很有用 存储过程。
另见: