在 PL/SQL 更新时触发
Trigger on update in PL/SQL
我成功执行了这段代码:
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;
/
基本上我想做的是在员工 (table emp) 时将 n-uplet (:new.deptno,'A SAISIR','A SAISIR'
) 插入 table deptno
table 部门中不存在的部门受到影响。我的触发器适用于插入查询但不适用于更新查询。
像这样使用
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”引用是可能的,因为
没有现有的行。
- 行级更新触发器: ":NEW" 和
":OLD" 引用是可能的。 ":NEW" 代表新值
出现在导致触发器触发的 DML 语句中。
“:OLD”表示列中的现有值,先于
正在应用更新。
- 行级 DELETE 触发器: 仅“:OLD”
参考是可能的,因为没有新的数据出现在
触发语句,只是要删除的现有行。
此处:NEW值仅在AFTER
定时触发期间获得。
参考这里了解更多信息
http://oracle-base.com/articles/misc/database-triggers-overview.php
除非这只是 SQL 课程的作业,否则我强烈建议您不要做您正在尝试做的事情。如果这是 SQL 课程的作业,他们教给你的是糟糕的概念。
您正在尝试做的是捕获员工数据的插入或更新。如果给定的部门编号与部门 table 中列出的任何部门都不匹配,您想使用该部门编号创建一个部门。
绝对糟糕,不好,非常糟糕的主意。在这种情况下,您希望 插入或更新失败。您希望用户若有所思地注视错误消息并说,"Wow, I guess I should create that department then assign employees to it."
然而,绝大多数时候,他会说类似这样的话,"Oops. That was dept number 17, not 170." 因此,当没有该部门时,您将在数据库中创建一个部门 170。一个设计良好的应用程序会在这种情况下询问用户是否要创建一个新部门。如果这是第一个分配到新部门的员工,则将创建该部门并继续分配。如果用户输入了错误的值,他有机会更正并继续。
如果没有用户,如果这是来自某个批处理来源,您仍然不想创建新部门。在这种情况下,您可以将有问题的员工数据写到日志中 table 以供稍后检查。
您希望您的数据库让您的用户尽可能轻松地完成工作。你想让犯错变得尽可能困难。使将虚假数据更容易地输入数据库并不是您应该努力实现的目标。
我成功执行了这段代码:
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;
/
基本上我想做的是在员工 (table emp) 时将 n-uplet (:new.deptno,'A SAISIR','A SAISIR'
) 插入 table deptno
table 部门中不存在的部门受到影响。我的触发器适用于插入查询但不适用于更新查询。
像这样使用
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”引用是可能的,因为 没有现有的行。
- 行级更新触发器: ":NEW" 和 ":OLD" 引用是可能的。 ":NEW" 代表新值 出现在导致触发器触发的 DML 语句中。 “:OLD”表示列中的现有值,先于 正在应用更新。
- 行级 DELETE 触发器: 仅“:OLD” 参考是可能的,因为没有新的数据出现在 触发语句,只是要删除的现有行。
此处:NEW值仅在AFTER
定时触发期间获得。
参考这里了解更多信息
http://oracle-base.com/articles/misc/database-triggers-overview.php
除非这只是 SQL 课程的作业,否则我强烈建议您不要做您正在尝试做的事情。如果这是 SQL 课程的作业,他们教给你的是糟糕的概念。
您正在尝试做的是捕获员工数据的插入或更新。如果给定的部门编号与部门 table 中列出的任何部门都不匹配,您想使用该部门编号创建一个部门。
绝对糟糕,不好,非常糟糕的主意。在这种情况下,您希望 插入或更新失败。您希望用户若有所思地注视错误消息并说,"Wow, I guess I should create that department then assign employees to it."
然而,绝大多数时候,他会说类似这样的话,"Oops. That was dept number 17, not 170." 因此,当没有该部门时,您将在数据库中创建一个部门 170。一个设计良好的应用程序会在这种情况下询问用户是否要创建一个新部门。如果这是第一个分配到新部门的员工,则将创建该部门并继续分配。如果用户输入了错误的值,他有机会更正并继续。
如果没有用户,如果这是来自某个批处理来源,您仍然不想创建新部门。在这种情况下,您可以将有问题的员工数据写到日志中 table 以供稍后检查。
您希望您的数据库让您的用户尽可能轻松地完成工作。你想让犯错变得尽可能困难。使将虚假数据更容易地输入数据库并不是您应该努力实现的目标。