首页 > 解决方案 > 范围的验证触发器 - Oracle

问题描述

每当创建或更新新记录时,都需要验证此人的薪水是否在工作范围内。

具有 job_id、job_title、min_salary、max_salary 字段的Job表。包含employee_id、name、job_id 和salary的Employee表。

这是我想要做的触发器:

CREATE OR REPLACE TRIGGER  range_valid
  BEFORE INSERT OR UPDATE
  OF JOB_ID, SALARY ON EMPLOYEES
  FOR EACH ROW
  DECLARE
     l_min_salary INTEGER;
     l_max_salary INTEGER;
     l_salary INTEGER;
  BEGIN
     SELECT MIN_SALARY, MAX_SALARY
     INTO l_min_salary, l_max_salary
     FROM JOBS
     WHERE JOB_ID = :new.JOB_ID;

  IF l_salary < l_min_salary OR l_salary > l_max_salary THEN
    RAISE_APPLICATION_ERROR (
        'Salario debe estar en el rango de' || l_min_salary || ' and ' || l_max_salary);
 END IF;

END range_valid;

但它向我显示了错误:

错误(9,5):PL/SQL:语句被忽略

错误(9,5):PLS-00201:必须声明标识符“L_SALARY”

在此处输入图像描述

我不知道如何解决它。

标签: oracletriggerseventtrigger

解决方案


您不需要声明l_salary和使用它而不分配值也没有意义;-)。

假设employees表包含一列salary,触发器应如下所示:

CREATE OR REPLACE TRIGGER range_valid
   BEFORE INSERT OR UPDATE OF job_id, salary
   ON employees
   FOR EACH ROW
DECLARE
   l_min_salary   INTEGER;
   l_max_salary   INTEGER;
BEGIN
   SELECT min_salary, max_salary
     INTO l_min_salary, l_max_salary
     FROM jobs
    WHERE job_id = :new.job_id;

   IF    :new.salary < l_min_salary
      OR :new.salary > l_max_salary
   THEN
      raise_application_error('Salario debe estar en el rango de' || l_min_salary || ' and ' || l_max_salary);
   END IF;
END range_valid;
/

推荐阅读