如果他们在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);
答案 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
。