如何编写触发器来检查工资是不是超出工资的最小或最大范围pl-sql Oracle

Posted

技术标签:

【中文标题】如何编写触发器来检查工资是不是超出工资的最小或最大范围pl-sql Oracle【英文标题】:How to write a trigger to check if salary is out of min or max range of salaries pl-sql Oracle如何编写触发器来检查工资是否超出工资的最小或最大范围pl-sql Oracle 【发布时间】:2013-05-19 20:27:21 【问题描述】:

我正在尝试使用 oracle 中的 pl-sql 编写一个触发器来检查薪水是小于还是大于最小或最大薪水,但它一直给我一个错误,它说:Error(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;

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

【问题讨论】:

正如 APC 所说,这在语法上看起来是有效的,如果不是在功能上。您确定错误来自此声明 - 当您使用 / 提交时?或者您是否一起运行多个语句并且没有正确分离它们,从而使编译器感到困惑?另外...如果job_id 也发生变化,您是否还需要检查salary 【参考方案1】:

您的语法没问题:I got your trigger to compile on SQL Fiddle(在@Ben 的帮助下)。

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

    它不会引发异常,因此实际上不会阻止输入 shonky 数据 用户通常看不到该消息。

如果您为小提琴运行 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;  

【讨论】:

SQL Fiddle 似乎与end 有问题;这不是我第一次看到它挣扎并抛出不正确的 ORA-00900 与 peocedures 以及触发器,即使使用模式面板也是如此。如果end is moved to previous line,它可以工作,但看起来很奇怪。我不知道为什么...我可能应该找人报告这件事真的... @AlexPoole,您使用的终止符不正确...您可以指定 /; 等:sqlfiddle.com/#!4/c4271 并且 APC 在 SQL Fiddle 中编译得很好...sqlfiddle.com/#!4/cb0fc它与亚历克斯的原因不同 @Ben - 我仍然花了一段时间才意识到有什么不同并发现了那个下拉菜单。谢谢,这让我困惑了一段时间! @APC 是正确的。除了一些调试之外,永远,永远,永远,依赖 dbms_output 来通知调用者。你需要提出一个错误。【参考方案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,则引发消息或错误。

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

【讨论】:

以上是关于如何编写触发器来检查工资是不是超出工资的最小或最大范围pl-sql Oracle的主要内容,如果未能解决你的问题,请参考以下文章

7.02 求某列中的最小最大值

创建计算每个新插入员工的总工资的行级触发器

07-SQLSERVER聚合函数

范围触发器 - 员工工资

PLSQL新工资不显示或显示错误

用于查找每个部门的工资的最大值、最小值、平均值、总和的 Pig 脚本