我尝试创建一个 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 触发器代码中使用 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] 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/