【问题标题】:Oracle Trigger with If Statement AND OR conditions带有 If 语句 AND OR 条件的 Oracle 触发器
【发布时间】:2014-02-08 11:11:59
【问题描述】:

我正在尝试让 oracle 触发器工作。

这是我目前的代码:

CREATE OR REPLACE TRIGGER CHK_SALES_JOB 
BEFORE INSERT OR UPDATE OF JOB_ID ON EMPLOYEES 
FOR EACH ROW
BEGIN
  IF :old.department_id = 80 AND (:new.job_id != 'SA_REP' OR :new.job_id != 'SA_MAN') THEN 
      RAISE_APPLICATION_ERROR(-20001, 'Sales Department can only have SA_MAN or SA_REP');
  END IF;
END;

这是更新声明:

UPDATE employees
SET job_id = 'SA_REP'
WHERE employee_id = 179;

我目前面临的问题是,如果使用 if 语句,它只会像这样工作:

IF :old.department_id = 80 AND :new.job_id != 'SA_REP' THEN 
    RAISE_APPLICATION_ERROR(-20001, 'Sales Department can only have SA_MAN or SA_REP');
END IF;

如果我在 If 语句中有 OR 条件,则代码将永远无法工作。它将毫无问题地编译触发器,但是当我尝试更新员工表时,它会不断显示 RAISE_APPLICATION_ERROR。

有没有办法解决这个问题?

提前致谢

【问题讨论】:

    标签: sql oracle triggers


    【解决方案1】:

    将 OR 替换为 NOT IN:

    CREATE OR REPLACE TRIGGER CHK_SALES_JOB 
    BEFORE INSERT OR UPDATE OF JOB_ID ON EMPLOYEES 
    FOR EACH ROW
    BEGIN
      IF :old.department_id = 80 AND :new.job_id NOT IN ('SA_REP', 'SA_MAN') THEN 
          RAISE_APPLICATION_ERROR(-20001, 'Sales Department can only have SA_MAN or SA_REP');
      END IF;
    END;
    

    【讨论】:

    • or 替换为and 可能更容易。
    • 只要条件之一为真,(:new.job_id != 'SA_REP' OR :new.job_id != 'SA_MAN') 就会评估为真。布尔逻辑表示true OR false = truetrue AND false = false。将 NOT IN ('SA_REP', 'SA_MAN') 与初始 OR 条件进行比较。当:new.job_id = 'SA_REP' 时,初始条件将评估为真,因为:new.job_id != 'SA_MAN' 评估为真。
    猜你喜欢
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 2019-08-15
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多