1

我是 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
...

谢谢

4

2 回答 2

2

你走错路了。即使在修复语法错误之后,触发器也会引发运行时“变异表”错误 - 您在之后错过了分号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,并且在更新语句级别触发器之后,如果变量为空则引发异常。注意:这仅适用于个别更新。

于 2012-12-16T13:15:05.417 回答
0

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

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

于 2012-12-18T01:34:59.127 回答