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

标签 linux oracle shell

我尝试创建一个 Oracle 触发器,在插入或更新表后,触摸 Linux 主机中的一个文件。

所以我创建了一个这样的 shell 脚本:

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

并修改权限:

chmod +x test1.sh

然后我使用系统登录 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.

我搜索了很多解决方案,但没有一个可行。我该如何处理?请问。

最佳答案

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


另见:

关于linux - 在 Oracle 触发器代码中使用 'exec',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42685709/

相关文章:

linux - 在 Unix 中递归地用先前回显的值替换回显值

python - 如何导入使用 --user 选项安装的模块?

linux - redhat中的时区更改

python - Ansible IP 地址可变远程主机

linux - 要定位的库 -lsocket

sql - Oracle 持续时间函数

sql - Oracle列值修改

Oracle PL/SQL : a scheduled procedure, 导致触发触发器?

shell - 无需sudo密码执行Shell脚本

linux - 在文件中查找特定字符串,然后删除具有相同文件名的其他文件