【问题标题】:trigger for updating a value更新值的触发器
【发布时间】:2012-12-18 09:34:59
【问题描述】:

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

谢谢

【问题讨论】:

标签: plsql triggers


【解决方案1】:

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

【讨论】:

  • @Manolo:您还需要将错误代码传递给RAISE_APPLICATION_ERROR
  • @Manolo:我不是 100% 确定你想要实现什么......如果行级触发器触发,则表中存在一条记录 - 你的检查没有多大意义。也许您想检查其他表中是否存在某些记录?
  • 嗨@a1ex07 我希望,例如,如果我将更新员工集薪水 = 2000 放在 emp_id=100 处,并且代码 100 不存在,那么它会显示一条错误消息
  • @Manolo:你能发布表格结构吗?是否要检查同一表中是否存在 code=100?
  • 我刚刚放了表结构,我想在更新之前先检查代码100是否存在,使用触发器,如果​​不存在则显示错误消息。谢谢
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2021-09-23
    • 2012-02-11
    • 1970-01-01
    相关资源
    最近更新 更多