-1

我正在尝试编写一个触发器来检查工资是否小于或大于 oracle 中使用 pl-sql 的最低或最高工资,但它一直给我一个错误,它说:错误(11,1):PLS-00103:遇到符号“UPDATE”

CREATE OR REPLACE TRIGGER MIN_MAX_SAL
after update 
of salary on employees
for each row
DECLARE
min_sal jobs.min_salary%type;
max_sal jobs.max_salary%type;
begin
select min_salary , max_salary into min_sal , max_sal from jobs 
where job_id = :new.job_id ;
if :new.salary > max_sal  or :new.salary < min_sal then
dbms_output.put_line('Wrong');
end if;
End;

请帮我操作这个触发器,谢谢;

4

2 回答 2

3

你的语法没问题:我让你的触发器在 SQL Fiddle 上编译(在@Ben 的帮助下)。

但是运行一些插入显示了您的触发器的主要问题,即 DBMS_OUTPUT 的使用。DBMS_OUTPUT 太糟糕了!为了关系完整性,因为:

  1. 它不会引发异常,因此实际上不会阻止输入 shonky 数据
  2. 该消息通常对用户不可见。

如果您为小提琴运行 DML,您将看到两个 INSERT 语句都成功,即使其中一个违反了规则,并且没有显示任何消息。这就是为什么抛出异常要好得多,如下所示:

if :new.salary > max_sal  or :new.salary < min_sal then
    raise_application_error(-20000, 'The input salary is outside the acceptable boundaries for this job');
end if;  
于 2013-05-19T21:11:11.437 回答
2

您可以尝试使用如下查询:

select count(*)
into   salary_out_of_range
from   jobs 
where  job_id = :new.job_id and
       :new.salary not between min_sal and max_sal;

...并检查salary_out_of_range 是否等于0 或1。如果为1,则引发消息或错误。

不要忘记,每当您更改工作表中的最低和最高工资时,您都需要进行检查。

于 2013-05-19T20:49:44.630 回答