Plsql 用于更新值的触发器

Plsql 用于更新值的触发器,plsql,triggers,Plsql,Triggers,我是PLSQL的新手,我想创建一个触发器,在进行更新之前首先检查表中是否有记录。 到目前为止,我得到的代码是: CREATE OR REPLACE TRIGGER table_bu BEFORE UPDATE ON employee FOR EACH ROW DECLARE v_employee_id:=employee.employee_ID%TYPE; BEGIN SELECT employee_id INTO v_employee_id FROM employee; EXC

我是PLSQL的新手,我想创建一个触发器,在进行更新之前首先检查表中是否有记录。 到目前为止,我得到的代码是:

CREATE OR REPLACE TRIGGER table_bu
BEFORE UPDATE ON employee
FOR EACH ROW
DECLARE
    v_employee_id:=employee.employee_ID%TYPE;
BEGIN
    SELECT employee_id INTO v_employee_id FROM employee;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        RAISE_APPLICATION_ERROR (-20001,'data not found');
END;
如何创建一个触发器来检查表中是否存在记录,如果不存在,则不允许更新。 我的表格结构是:

employee_id NUMBER
employee_name VARCHAR(20)
employee_salary NUMBER
...

谢谢你走错了路。即使在修复语法错误后,触发器仍将抛出运行时“Mutating table”错误-您在
raise\u application\u error
之后遗漏了分号(它还应包含两个参数,而不是一个)。正确语法:

EXCEPTION
WHEN NO_DATA_FOUND THEN
    RAISE_APPLICATION_ERROR (-20001, 'data not found'); -- 1st parameter -error code
更新

据我所知,问题的更新版本是,如果记录不存在,您希望显示错误。行级触发器方法的问题是,如果由于
WHERE
中的条件而未找到任何内容,则不会执行该方法。最简单的方法是检查客户端受影响的行数并在那里引发错误。或者,您可以编写一个过程,在执行所需更新后检查
sql%rowcount
,如果为0,则抛出异常。
如果您希望以一种困难的方式执行此操作,则可以在重置变量的update语句级触发器(例如将其设置为
null
)之前,在将此变量设置为
NEW.employee\u ID
的update行级触发器之后,创建类型为
employee.employee\u ID%type
的包变量,以及update语句级触发器,如果变量为null,则引发异常。注意:这仅适用于单个更新。

“如何创建一个触发器来检查表中是否存在记录,如果不存在,则不允许更新。”


实际上,只有一种切实可行的方法可以做到这一点——使用引用约束(外键)。

@Manolo:您还需要将错误代码传递给
引发应用程序错误
@Manolo:我不是100%确定您想要实现什么。。。如果触发行级触发器,则表中存在一条记录-您的检查没有多大意义。也许您想检查其他表中是否存在某些记录?Hi@a1ex07我想知道,如果我将update employee set salary=2000放在emp_id=100的位置,而代码100不存在,那么它会显示一个错误message@Manolo:您可以发布表结构吗?是否要检查同一个表中是否存在代码=100?我刚刚放置了表结构,我想在执行更新之前首先检查代码100是否存在,如果触发器不存在,则显示错误消息。谢谢你能帮忙吗?