【问题标题】:How to create a trigger to call the procedure with an update statement如何创建触发器以使用更新语句调用过程
【发布时间】:2018-08-28 07:13:16
【问题描述】:

我需要编写一个程序并更新触发器。当对表进行任何更新时,触发器应该调用该过程。过程应该更新另一个表中的更改。在另一个表的旧值中,应该有更新的值。

【问题讨论】:

  • 您是特别需要更新另一个表(即 SQL UPDATE 语句),还是只是想以某种方式捕获更改历史记录?
  • 我只想捕捉更新历史。

标签: oracle plsql database-trigger


【解决方案1】:

你所描述的听起来像一个普通的日志;你真的不需要一个程序,触发器就可以了。这是一个例子:

SQL> create table emp_log (empno number, sal_old number, sal_new number);

Table created.

SQL> create or replace trigger trg_bu_emp
  2    before update of sal on emp
  3    for each row
  4  begin
  5    insert into emp_log (empno, sal_old, sal_new)
  6    values
  7    (:new.empno, :old.sal, :new.sal);
  8  end;
  9  /

Trigger created.

SQL> select empno, ename, sal from emp where ename = 'KING';

     EMPNO ENAME             SAL
---------- ---------- ----------
      7839 KING             5000

SQL> update emp set sal = 7000 where ename = 'KING';

1 row updated.

SQL> select * from emp_log;

     EMPNO    SAL_OLD    SAL_NEW
---------- ---------- ----------
      7839       5000       7000

SQL>

[编辑,阅读评论后]

家庭作业,嗯?所以 - 创建一个过程:

SQL> rollback;

Rollback complete.

SQL> create or replace procedure p_emp_sal_log
  2    (par_empno in emp.empno%type, par_sal_old in emp.sal%type,
  3                                  par_sal_new in emp.sal%type)
  4  is
  5  begin
  6    insert into emp_log (empno, sal_old, sal_new)
  7    values
  8    (par_empno, par_sal_old, par_sal_new);
  9  end;
 10  /

Procedure created.

SQL> create or replace trigger trg_bu_emp
  2    before update of sal on emp
  3    for each row
  4  begin
  5    p_emp_sal_log(:new.empno, :old.sal, :new.sal);
  6  end;
  7  /

Trigger created.

SQL> update emp set sal = 2000 where ename = 'KING';

1 row updated.

SQL> select * from emp_log;

     EMPNO    SAL_OLD    SAL_NEW
---------- ---------- ----------
      7839       5000       2000

SQL>

【讨论】:

  • 我必须使用一个程序。这是强制性的。
  • 这里你只使用了薪水..如果表有名字、sal、date_of_birth等怎么办..你将更新这些值中的任何一个......所以应该动态给出.
  • 包括您希望将其值登录到触发器(或过程)的所有列。如果您不关心具体更新了哪一列,则可以选择删除 before update of sal on emp 子句的 of 部分。
  • 谢谢..我也做过同样的事情,但是在调用过程时出错了。
  • @Dharani.C 如果答案让您满意,为什么不点赞并标记为正确答案,这将有助于社区中的其他人理解正确答案,最重要的是表示感谢给在这里自愿贡献的人。
猜你喜欢
  • 1970-01-01
  • 2013-08-24
  • 2020-11-23
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多