预期时没有来自触发器的输出

时间:2014-09-09 05:07:08

标签: sql oracle plsql triggers

如果他们在1993年之前注册,我试图在插入/删除/更新学生进入enrols关系时触发我的触发器。之后我希望它引发异常。

我的例外情况都没有提高我提供的DBMS输出。

插入似乎有效,因为当我插入一个新元组时,paper_cost减少了10%(虽然没有引发异常)

删除和更新似乎没有做我期望他们做的事情 - 删除我希望它将paper_cost提高10%。

有什么想法吗?我在这里陷入脑循环!

CREATE OR REPLACE TRIGGER discount_160
BEFORE INSERT OR UPDATE ON enrols
FOR EACH ROW
DECLARE
    excep EXCEPTION;
    updated EXCEPTION;
    deleted EXCEPTION;
BEGIN
 IF UPDATING THEN
  IF (:OLD.date_enrolled < TO_DATE('01-Jan-1993', 'dd-mon-yyyy')) THEN
     IF (:OLD.paper_code = 160) THEN
        UPDATE papers
        SET paper_cost = paper_cost* 0.9
        WHERE papers.paper_code = :OLD.paper_code;
        RAISE updated;
   END IF;
END IF;
ELSIF INSERTING THEN --inserting
  IF (:NEW.date_enrolled < TO_DATE('01-Jan-1993', 'dd-mon-yyyy')) THEN
     IF (:NEW.paper_code = 160) THEN
        UPDATE papers
        SET paper_cost =  paper_cost * 0.9
        WHERE papers.paper_code = :NEW.paper_code;
        RAISE excep;
     END IF;
  END IF;
ELSE --deleting
    IF (:OLD.date_enrolled < TO_DATE('01-Jan-1993', 'dd-mon-yyyy')) THEN
       IF (:OLD.paper_code = 160) THEN
          UPDATE papers
          SET paper_cost = paper_cost * 1.1
          WHERE papers.paper_code = :NEW.paper_code;
          RAISE deleted;
       END IF;
    END IF;
   END IF;

EXCEPTION
   WHEN excep THEN
        DBMS_OUTPUT.PUT_LINE('inserted and updated');
   WHEN updated THEN
        DBMS_OUTPUT.PUT_LINE('updated');
   WHEN deleted THEN
        DBMS_OUTPUT.PUT_LINE('deleted');
END;
/

我的enrols表:

CREATE TABLE enrols
   (paper_code         INT     ,
   student_id         INT      REFERENCES student(student_id),
   date_enrolled      DATE,
   dept_id            INT,
   PRIMARY KEY(paper_code, student_id, dept_id),
   FOREIGN KEY (paper_code, dept_id) REFERENCES papers(paper_code, dept_id));

INSERT INTO enrols VALUES
   (160, 172384, TO_DATE('22-Mar-1994', 'dd-mon-yyyy'), 01);

1 个答案:

答案 0 :(得分:2)

  

“我的例外情况都没有提高我提供的DBMS输出   它“。

DBMS_OUTPUT显示在屏幕上。在大多数客户端中,默认情况下禁用它。根据客户端的不同,将其切换为开启状态。在SQL * Plus中它的工作原理如下:

SQL> create or replace trigger t34_trg 
  2  before insert on t34 for each row
  3  begin
  4      dbms_output.put_line('T34 '||:new.col1);
  5  end;
  6  /

Trigger created.

SQL>             
SQL> insert into t34 values (42)
  2  /

1 row created.

SQL> 
SQL> set serveroutput on
SQL> insert into t34 values (42)
  2  /
T34 42

1 row created.

SQL> 

DBMS_OUTPUT是用于记录或调试的糟糕工具:写入日志表是一种更好的方法。

至于这一个......

  

“删除我希望它将paper_cost提高10%。”

...您的触发器定义为

BEFORE INSERT OR UPDATE ON enrols

....所以你的代码永远不会执行。但是一旦你解决了这个问题就会出现问题。如果查看为删除执行的代码,它将包含此WHERE子句:

WHERE papers.paper_code = :NEW.paper_code;

:new值为空,因为您已删除记录:您需要使用:old