我是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
...
由于
答案 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)
“我如何创建一个触发器来检查表中是否存在记录,如果它不存在则不允许更新。”
实际上只有一种实用的方法 - 使用引用约束(外键)。