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 &gt; :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 如何比较触发器中的表达式?的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL:如何启用模式中的所有触发器?

如何从 PL/SQL 中的触发器回滚列

如何通过 PL/SQL 中的触发器发送电子邮件

使用 PL/SQL 在触发器中中止插入/更新操作

如何在 Pl/SQL 中编写正则表达式匹配模式?

PL/SQL 中的触发器