触发PL / SQL中的更新

时间:2015-02-09 07:59:52

标签: sql oracle plsql

我成功执行了这段代码:

CREATE or replace TRIGGER dept_no_exist
 BEFORE insert OR UPDATE on emp
 for each row
 DECLARE
    x_count NUMBER;
 begin
    select count(*) into x_count from dept where deptno=:new.deptno;
    if(x_count=0) then
            insert into dept values(:new.deptno,'A SAISIR','A SAISIR');
    end if;
 end;
 /

基本上我要做的是当员工(表emp)受到不存在的离职影响时,将n-uplet(:new.deptno,'A SAISIR','A SAISIR')插入到表deptno中桌子部门。我的触发器适用于插入查询,但不适用于更新查询。

2 个答案:

答案 0 :(得分:0)

像这样使用

CREATE or replace TRIGGER dept_no_exist
 AFTER insert OR UPDATE on emp
 for each row
 DECLARE
    x_count NUMBER;
 begin
    select count(*) into x_count from dept where deptno=:new.deptno;
    if(x_count=0) then
            insert into dept values(:new.deptno,'A SAISIR','A SAISIR');
    end if;
 end;
 /

行级触发器可以使用:NEW.column-name :OLD.column-name 引用访问列的新值和现有值,同时牢记以下内容限制。

  • 行级INSERT触发器:仅":NEW"引用是可能的 没有现有的行。
  • 行级UPDATE触发器:两者":NEW"和 ":OLD"参考是可能的。 ":NEW"代表新的价值 在DML语句中显示导致触发器触发。 ":OLD"表示列之前的现有值 正在应用更新。
  • 行级DELETE触发器:仅":OLD" 引用是可能的,因为没有新的数据 触发语句,只是要删除的现有行。

此处:仅在AFTER时序触发期间获取新值。

请参阅此处了解更多信息

http://oracle-base.com/articles/misc/database-triggers-overview.php

答案 1 :(得分:0)

除非这只是SQL课程的作业,否则我强烈建议不要做你想做的事情。如果它是SQL课程的作业,他们会教你很可怕的概念。

您尝试执行的操作是捕获员工数据的插入或更新。如果给定的部门编号与部门表中列出的任何部门都不匹配,您希望创建一个具有该部门编号的部门。

绝对可怕,没有好,非常糟糕的主意。在这种情况下,您希望插入或更新失败。您希望用户仔细凝视错误消息并说出,"哇,我想我应该创建该部门然后将员工分配给它。"

然而,绝大多数时候,他会说“哎呀”。这是17号部门而不是170号。"因此,当没有这样的部门时,您将在数据库中创建一个部门170。在这种情况下,精心设计的应用程序会询问用户是否要创建新部门。如果这是第一个被分配到新部门的员工,那么将创建部门并继续分配。如果用户输入了错误的值,他就有机会纠正它并继续。

如果没有用户,如果这是来自某个批量来源,您仍然不想创建新部门。在这种情况下,您可以将有问题的员工数据写入日志表,以便稍后进行检查。

您希望数据库使用户尽可能轻松地完成工作。你想尽可能地犯错误。更容易将虚假数据输入数据库并不是您应该努力的目标。