PL/SQL 如何比较触发器中的表达式?
Posted
技术标签:
【中文标题】PL/SQL 如何比较触发器中的表达式?【英文标题】:PL/SQL How to compare an expression in a trigger? 【发布时间】:2017-12-06 09:08:24 【问题描述】:每当学生的新 GPA 比旧 GPA 低 1 或更多时,我都会尝试输出一条消息。
Create or Replace TRIGGER AUGPA
after update on students
for each row -- or should I put 'for GPA' the column name
begin
if (:new.gpa - :old.gpa) >= 1 -- How do I compare these expressions? I get an error here.
THEN
dbms_output.put_line ('Old GPA is lower than previous GPA by at least 1 point.')
End if;
End;
/
学生桌
SNUM SNAME STANDING MAJOR GPA MAJORGPA
**** ***** ******** ***** *** ********
121 Liz 2 FIN 2.8 3.2
【问题讨论】:
您能提供有关您的学生表的详细信息吗? 编辑了更多细节! 真的不清楚你在问什么问题。除了dbms_output
调用后缺少的分号之外,您的程序可以正常工作。逻辑有点混乱,您需要调整条件以使其符合您要强制执行的规则。
【参考方案1】:
您可以尝试以下更改:
1) 你可以使用
学生 GPA 更新后
2) 你可以比较喜欢
IF :new.gpa < :old.gpa THEN
dbms_output.put_line ('Old GPA is lower than previous GPA by at least 1
point.')
END IF;
【讨论】:
【参考方案2】:按照以下步骤和此代码获得所需的结果。
Create or Replace TRIGGER AUGPA
after update on students
for each row
begin
if :new.gpa - :old.gpa >= 1
THEN
dbms_output.put_line ('Old GPA is lower than current GPA by at least 1 point.');
End if;
End;
/
set serveroutput on;
update Students set gpa = gpa + 1 ;
commit;
【讨论】:
问题:如果我通过将 Liz 的 GPA 更改为 2.0 来更新它,它应该不会输出消息。有没有办法在触发器中做到这一点?只有低于 1 或更高的 gpa 才会有消息。 你的意思是if :new.gpa > :old.gpa and :new.gpa != 2.0
?
因此,如果 Liz'a GPA 更改为 2.0,则应该没有输出。由于 2.8 - 2.0 = 0.8。并且 0.8 小于 1。如果我添加了另一个 GPA 为 3.0 并且他们的新 GPA 为 2.0 的用户,那么应该有一个输出,因为它减少了 1。谢谢!
@Lizzie : 修改现在看看。
我在 line/col 5/3 处遇到错误。 PLS-00103:在预期以下情况之一时遇到符号“END”:符号“l”被替换为“END”以继续。【参考方案3】:
您的操作是倒退的。 让我们使用下面的 new.gpa = 1.5, old.gpa = 3。所以 gpa 下降了 1.5,所以应该发出消息。不会发出消息:代码是“如果 new.gpa - old.gpa >= 1 then message ...” 但是 1.5 - 3 = -1.5 不是 >- 1. 更改为“如果 old.gpa -新的.gpa >= 1"。
@Anand 建议不好,因为如果 gpa 从 3 降至 2.9,它会生成消息;只需 0.1 滴
【讨论】:
以上是关于PL/SQL 如何比较触发器中的表达式?的主要内容,如果未能解决你的问题,请参考以下文章