我成功执行了这段代码:
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
中桌子部门。我的触发器适用于插入查询,但不适用于更新查询。
答案 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 引用访问列的新值和现有值,同时牢记以下内容限制。
此处:仅在AFTER
时序触发期间获取新值。
请参阅此处了解更多信息
http://oracle-base.com/articles/misc/database-triggers-overview.php
答案 1 :(得分:0)
除非这只是SQL课程的作业,否则我强烈建议不要做你想做的事情。如果它是SQL课程的作业,他们会教你很可怕的概念。
您尝试执行的操作是捕获员工数据的插入或更新。如果给定的部门编号与部门表中列出的任何部门都不匹配,您希望创建一个具有该部门编号的部门。
绝对可怕,没有好,非常糟糕的主意。在这种情况下,您希望插入或更新失败。您希望用户仔细凝视错误消息并说出,"哇,我想我应该创建该部门然后将员工分配给它。"
然而,绝大多数时候,他会说“哎呀”。这是17号部门而不是170号。"因此,当没有这样的部门时,您将在数据库中创建一个部门170。在这种情况下,精心设计的应用程序会询问用户是否要创建新部门。如果这是第一个被分配到新部门的员工,那么将创建部门并继续分配。如果用户输入了错误的值,他就有机会纠正它并继续。如果没有用户,如果这是来自某个批量来源,您仍然不想创建新部门。在这种情况下,您可以将有问题的员工数据写入日志表,以便稍后进行检查。
您希望数据库使用户尽可能轻松地完成工作。你想尽可能地犯错误。更容易将虚假数据输入数据库并不是您应该努力的目标。