PL/SQL创建触发器有问题

PL/SQL创建触发器有问题,sql,database,oracle,plsql,triggers,Sql,Database,Oracle,Plsql,Triggers,我必须在Employee表上创建一个触发器。如果为Employee表发出INSERT或UPDATE语句,触发器将启动,并确保“salary”字段的值符合job_min_sal表中的条件。经过一次又一次的尝试,我得到了一个变异表错误,现在我非常沮丧,不知道该怎么办 JOB_MIN_SALARY TABLE: JOB VARCHAR2(50) PRIMARY KEY MIN_SAL NUMBER(7,2) NOT NULL JOB_MIN_SAL表中填充了各种职务和工资。我对我的扳机感到

我必须在Employee表上创建一个触发器。如果为Employee表发出INSERT或UPDATE语句,触发器将启动,并确保“salary”字段的值符合job_min_sal表中的条件。经过一次又一次的尝试,我得到了一个变异表错误,现在我非常沮丧,不知道该怎么办

 JOB_MIN_SALARY TABLE:
  JOB VARCHAR2(50) PRIMARY KEY
  MIN_SAL NUMBER(7,2) NOT NULL
JOB_MIN_SAL表中填充了各种职务和工资。我对我的扳机感到困惑,不知道我能不能从这里得到一些帮助

 CREATE OR REPLACE TRIGGER employee_job_salary
   BEFORE INSERT OR UPDATE OF SALARY on employee
     FOR EACH ROW
     DECLARE 
      v_salary    NUMBER;


    BEGIN
      SELECT minimum_salary
      INTO v_salary
      FROM job_min_salary
      WHERE UPPER(job) = UPPER(:NEW.job);
我知道我真的很遥远,我只是在寻求帮助,因为这需要什么,我需要采取什么步骤来实现这一点。谢谢

 The EMPLOYEE table:

 (
    EMPLOYEE_ID NUMBER(4)
    EMPLOYEE_NAME VARCHAR2(20)
    JOB VARCHAR2(50)
    MANAGER_ID NUMBER(4)
    HIRE_DATE DATE
    SALARY NUMBER(9)
    COMMISION NUMBER(9)
    DEPARTMENT_ID NUMBER(4)
 );

我猜想你在做类似的事情 将新薪资与最低薪资标准进行比较,并仅在以下情况下更新:new.salary>=v\u salary

如果不满足这一要求,您将如何做?是捕获异常还是忽略错误或返回错误代码以进行调试


发布更多信息

你的触发器的其余部分是什么?您显示的部分不应给出突变表错误。您发布的代码不会引发突变触发器错误。但是,它会生成一个语法错误,因为表名
JOB\u MIN\u SAL
与您选择的表名
JOB\u MINIMUM\u SALARY
不匹配,并且列名也不匹配(
MIN\u SAL
MINIMUM\u SALARY
)。您发布的代码也缺少
结尾
。如果您实际得到的是一个突变触发器错误,那么您的示例将丢失创建该错误的任何逻辑。@AlexPoole我刚才说的是我以前得到过该错误。我重新开始,我不知道从这一点上走到哪里。我更新了表格的名称,因为我只是很快地在这里输入了它们,没有像我应该做的那样复制和粘贴。@DaBulls33你从那个链接中发现了什么吗?如果是的话,您认为这种错误的可能原因是什么?那么,您目前的问题到底是什么?您没有指定标准是什么,以及应该采取什么措施。通常,您会进行一些常规测试,如果失败,将引发异常。
CREATE TABLE job_min_salary
(
    job     VARCHAR2(50) PRIMARY KEY,
    min_sal NUMBER(7,2)  NOT NULL
);

INSERT INTO job_min_salary VALUES('CEO','100');
-- 1 rows inserted.

CREATE TABLE employee
(
    employee_id     NUMBER(4),
    employee_name   VARCHAR2(20),
    job             VARCHAR2(50),
    manager_id      NUMBER(4),
    hire_date       DATE,
    salary          NUMBER(9),
    commision       NUMBER(9),
    department_id   NUMBER(4)
);

INSERT INTO employee VALUES(1, 'Name', 'CEO', 1, TO_DATE('2000-01-01', 'YYYY-MM-DD'), 80, 80, 1);
-- 1 rows inserted.

CREATE OR REPLACE TRIGGER employee_job_salary
BEFORE INSERT OR UPDATE OF salary ON employee
FOR EACH ROW
DECLARE 
    v_salary  NUMBER(1);
BEGIN
    SELECT  1
    INTO    v_salary
    FROM    job_min_salary
    WHERE   UPPER(job)  = UPPER(:NEW.job)
    AND     :NEW.salary >= min_sal;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        RAISE_APPLICATION_ERROR(-20999, 'Salary value is too low for given job');
END;
-- TRIGGER EMPLOYEE_JOB_SALARY compiled

SELECT * FROM employee;
-- 1    Name    CEO 1   2000-01-01 00:00:00 80  80  1

UPDATE employee
SET    salary = 10
WHERE  job    = 'CEO';
-- ORA-20999: Salary value is too low for given job

UPDATE employee
SET    salary = 100
WHERE  job    = 'CEO';
-- 1 rows updated.

SELECT * FROM employee;
-- 1    Name    CEO 1   2000-01-01 00:00:00 100 80  1