在Oracle触发器代码中使用'exec'

时间:2017-03-09 02:42:11

标签: linux oracle shell

我尝试创建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。

1 个答案:

答案 0 :(得分:0)

问题是您在触发器代码PL / SQL中使用execexec是一个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;
/

来自PL/SQL Command Reference

  

EXECUTE

     

EXEC [UTE]声明

     

执行单个PL / SQL语句。 EXECUTE命令经常出现   当您想要执行引用a的PL / SQL语句时很有用   存储过程。

另见: