【问题标题】:Create Oracle Trigger to execute PL/SQL program when row is inserted to table将行插入表时创建 Oracle 触发器以执行 PL/SQL 程序
【发布时间】:2015-05-30 23:23:15
【问题描述】:

我想在 Oracle 11g 中创建一个触发器,当 BATCHTYPE 列的值等于“STANDARD”时,当向 DLGPROD.INV_CHEMICAL 表中插入一行时会触发该触发器。

触发器将执行一个名为 SYS.STDEMAIL 的 PL/SQL 程序

当我尝试调用 STDEMAIL 程序时,我得到 PLS-00331 非法引用。

我对使用触发器或 PL/SQL 非常陌生,我不知道如何告诉触发器 #1 - 仅在更新行且 BATCHTYPE 列值为“标准”时触发,并且#2 - 如何正确调用属于 SYS 模式的名为 STDEMAIL 的 PL/SQL 程序。

任何帮助将不胜感激。

【问题讨论】:

  • 你能告诉我们你写的代码吗?
  • 还有sys.stdemail 过程的定义(我假设它是一个过程而不是一个函数)。可能与您的错误无关,但在 SYS 架构中创建对象是 Oracle 不赞成的,应该避免。 PL/SQL 在SYS 模式中的行为方式与在其他地方的行为方式不同,这有时也会让粗心的开发人员陷入困境。到目前为止,创建一个可以拥有此类代码的适当强大的帐户是首选方法。

标签: oracle plsql oracle11g


【解决方案1】:

来自文档 (http://docs.oracle.com/cd/B10501_01/appdev.920/a96590/adg13trg.htm)

#1 在这里你可以看到Emp_tab是你正在查看的表,Sal是一个列。使用new 关键字,如@9​​87654325@,您可以检查新插入的值。

CREATE OR REPLACE TRIGGER Log_salary_increase
AFTER UPDATE ON Emp_tab
FOR EACH ROW
WHEN (new.Sal > 1000)
BEGIN
    INSERT INTO Emp_log (Emp_id, Log_date, New_salary, Action)
       VALUES (:new.Empno, SYSDATE, :new.SAL, 'NEW SAL');
END;

#2 您可以使用call 关键字来执行现有的过程

CREATE OR REPLACE TRIGGER logontrig AFTER LOGON ON DATABASE 
-- Just call an existing procedure. The ORA_LOGIN_USER is a function
-- that returns information about the event that fired the trigger.
CALL foo (ora_login_user)
/

【讨论】:

    猜你喜欢
    • 2017-10-18
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多