【问题标题】:Using 'exec' in Oracle trigger code在 Oracle 触发器代码中使用 'exec'
【发布时间】:2017-07-29 20:52:04
【问题描述】:

我尝试创建一个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.

我已经搜索了很多解决方案,但没有一个是有效的。我该如何处理它?请。

【问题讨论】:

    标签: linux oracle shell


    【解决方案1】:

    问题是您在 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

    执行

    执行[UTE] 语句

    执行单个 PL/SQL 语句。 EXECUTE 命令通常是 当您想要执行引用一个 PL/SQL 语句时很有用 存储过程。


    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-04
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 2013-02-09
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多