【问题标题】:Trigger in PLSQLPLSQL 中的触发器
【发布时间】:2019-03-19 14:10:24
【问题描述】:

为什么会出现这个错误?

问题)编写一个触发器来限制插入的佣金多于工资。

编,

SET SERVEROUTPUT ON;
CREATE OR REPLACE TRIGGER EMP2_TR
BEFORE INSERT ON EMP2
FOR EACH ROW WHEN (NEW.COMM > NEW.SAL)
BEGIN
    Raise_Application_Error (-20100, 'COMMISION MUST NOT BE GREATER THEN SALARY');      
END;
/

错误,

SQL> INSERT INTO EMP2 VALUES(101,'RAMAN',100,1000);
INSERT INTO EMP2 VALUES(101,'RAMAN',100,1000)
            *
ERROR at line 1:
ORA-20100: COMMISION MUST NOT BE GREATER THEN SALARY
ORA-06512: at "AYUSH.EMP2_TR", line 2
ORA-04088: error during execution of trigger 'AYUSH.EMP2_TR'

表格,

SQL> DESC EMP2    
 Name                                      Null?    Type    
 ----------------------------------------- -------- -------------------------    
 EMP_NO                                             NUMBER(3)    
 NAME                                               VARCHAR2(10)    
 SAL                                                NUMBER(10,3)    
 COMM                                               NUMBER(10,2)

【问题讨论】:

  • 我们不知道 emp2 列...
  • SQL> DESC EMP2 名称为空?类型 - - - - - - - - - - - - - - - - - - - - - - - - - ---------------------------- EMP_NO NUMBER(3) NAME VARCHAR2(10) SAL NUMBER(10,3) COMM NUMBER(10, 2)
  • 您尝试在薪水 100 时插入佣金 1000 - 这样行为与预期的一样。

标签: sql oracle plsql database-trigger


【解决方案1】:

您的插入未指定值的顺序,因此使用表中列的顺序。很可能sal 列是在comm 列之前定义的。

您需要在插入语句中列出列:

insert into emp2 
  (empid, name, comm, sal) 
values 
  (101,'RAMAN',100,1000);

以便 Oracle 知道哪个值属于哪个列。

无论如何这都是很好的编码习惯

【讨论】:

    【解决方案2】:

    问题是:你为什么要用触发器来做这个?

    你应该这样做有一个约束:

    alter table emp2 add constraint chk_emp2_comm_sal check (comm <= sal);
    

    【讨论】:

    • 实际上在我的实用书中有一个问题要求使用触发器来做到这一点。
    • @AyushmanBokde 。 . .你的书应该与时俱进,向你展示如何使用约束正确地做到这一点。
    • 确实如此,但可以使用触发器来完成。
    • @GordonLinoff:这似乎是 PL/SQL 示例中的一种常见做法:将 PL/SQL 用于应该以不同方式更有效地完成的事情。我从来不明白这样的例子背后的原因。更糟糕的是确保参照完整性的触发器。我猜老师们根本不想为提出现实世界的例子而烦恼。
    • @a_horse_with_no_name 。 . .我什至得到了教学点。 . .假设它被表述为“让我们使用触发器来实现这个check 约束”。我能得到的。但不是“使用触发器解决这个问题”。这接近于说“使用游标解决这个其他问题(当不需要它们时)”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多