触发更新值

时间:2012-12-16 13:06:58

标签: 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;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        RAISE_APPLICATION_ERROR (-20001,'data not found');
END;

如何创建一个触发器来检查表中是否存在记录,如果该记录不存在则不允许更新。 我的表结构是:

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

由于

2 个答案:

答案 0 :(得分:2)

你走错了路。即使在修复语法错误之后,触发器也会抛出运行时“Mutating table”错误 - 在raise_application_error之后你错过了分号(它也应该使用2个参数,而不是一个参数)。正确的语法:

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

<强>更新

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

答案 1 :(得分:0)

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

实际上只有一种实用的方法 - 使用引用约束(外键)。