Sql update语句在而不是触发器oracle11g中不起作用
A) 编写PL/SQL触发器以更新“studentMark”表中的总计 当insert发生在同一个表中时。 查询:Sql update语句在而不是触发器oracle11g中不起作用,sql,database,triggers,oracle11g,Sql,Database,Triggers,Oracle11g,A) 编写PL/SQL触发器以更新“studentMark”表中的总计 当insert发生在同一个表中时。 查询: 我试了很多次。它插入了mark1和mark2的值,但没有更新总数-错误是什么?您插入的是表,而不是视图,因此不会发生触发器事件。如果在视图中插入以下内容,它会达到预期效果: CREATE VIEW STUDENTMARK_VIEW AS SELECT * FROM STUDENTMARK; CREATE OR REPLACE TRIGGER TOTAL_TRIG INSTEAD
我试了很多次。它插入了mark1和mark2的值,但没有更新总数-错误是什么?您插入的是表,而不是视图,因此不会发生触发器事件。如果在视图中插入以下内容,它会达到预期效果:
CREATE VIEW STUDENTMARK_VIEW
AS SELECT * FROM STUDENTMARK;
CREATE OR REPLACE TRIGGER TOTAL_TRIG INSTEAD OF INSERT ON STUDENTMARK_VIEW
FOR EACH ROW
BEGIN
INSERT INTO STUDENTMARK (STUD_ROLLNO,CLASS_NAME,MARK1,MARK2)
VALUES (:NEW.STUD_ROLLNO,:NEW.CLASS_NAME,:NEW.MARK1,:NEW.MARK2);
UPDATE STUDENTMARK SET TOTAL = :new.mark1+:new.mark2
WHERE stud_rollno = :new.STUD_ROLLNO;
END;
/
truncate table studentmark;
INSERT INTO STUDENTMARK (STUD_ROLLNO,CLASS_NAME,MARK1,MARK2)
VALUES (1,'CSE_B',100,100);
SELECT * FROM STUDENTMARK;
INSERT INTO STUDENTMARK (STUD_ROLLNO,CLASS_NAME,MARK1,MARK2,TOTAL)
VALUES (:NEW.STUD_ROLLNO,:NEW.CLASS_NAME,:NEW.MARK1,:NEW.MARK2,
:NEW.MARK1+:NEW.MARK2);
触发器中不需要单独的insert和update语句,您可以在插入期间计算总数:
INSERT INTO STUDENTMARK_VIEW (STUD_ROLLNO,CLASS_NAME,MARK1,MARK2)
VALUES (1,'CSE_B',100,100);
SELECT * FROM STUDENTMARK;
STUD_ROLLNO CLASS_NAME MARK1 MARK2 TOTAL
----------- ---------- ---------- ---------- ----------
1 CSE_B 100 100 200
不过,视图似乎有点毫无意义,因为它与表完全匹配。正如您所看到的,没有什么可以停止直接插入到表中并跳过计算。如果您计划允许其他人通过适当授予的权限插入视图而不是表中,但所有者仍然可以直接插入表中,这将是有意义的
如果要计算总计,可以将该列从基表中保留,然后在视图中计算:
CREATE VIEW STUDENTMARK_VIEW
AS SELECT * FROM STUDENTMARK;
CREATE OR REPLACE TRIGGER TOTAL_TRIG INSTEAD OF INSERT ON STUDENTMARK_VIEW
FOR EACH ROW
BEGIN
INSERT INTO STUDENTMARK (STUD_ROLLNO,CLASS_NAME,MARK1,MARK2)
VALUES (:NEW.STUD_ROLLNO,:NEW.CLASS_NAME,:NEW.MARK1,:NEW.MARK2);
UPDATE STUDENTMARK SET TOTAL = :new.mark1+:new.mark2
WHERE stud_rollno = :new.STUD_ROLLNO;
END;
/
truncate table studentmark;
INSERT INTO STUDENTMARK (STUD_ROLLNO,CLASS_NAME,MARK1,MARK2)
VALUES (1,'CSE_B',100,100);
SELECT * FROM STUDENTMARK;
INSERT INTO STUDENTMARK (STUD_ROLLNO,CLASS_NAME,MARK1,MARK2,TOTAL)
VALUES (:NEW.STUD_ROLLNO,:NEW.CLASS_NAME,:NEW.MARK1,:NEW.MARK2,
:NEW.MARK1+:NEW.MARK2);
或在基表上使用虚拟列:
CREATE TABLE STUDENTMARK
(
STUD_ROLLNO NUMBER(10),
CLASS_NAME VARCHAR2(10),
MARK1 NUMBER(5),
MARK2 NUMBER(5)
);
CREATE VIEW STUDENTMARK_VIEW AS
SELECT STUD_ROLLNO, CLASS_NAME, MARK1, MARK2, MARK1 + MARK2 AS TOTAL
FROM STUDENTMARK;
INSERT INTO STUDENTMARK (STUD_ROLLNO,CLASS_NAME,MARK1,MARK2)
VALUES (1,'CSE_B',100,100);
SELECT * FROM STUDENTMARK;
STUD_ROLLNO CLASS_NAME MARK1 MARK2
----------- ---------- ---------- ----------
1 CSE_B 100 100
SELECT * FROM STUDENTMARK_VIEW;
STUD_ROLLNO CLASS_NAME MARK1 MARK2 TOTAL
----------- ---------- ---------- ---------- ----------
1 CSE_B 100 100 200
或者保留物理列,并在执行计算的表上具有触发器;但在11g上使用虚拟列更简单、更安全。您的触发器位于STUDENTMARK\u视图上!如果希望在STUDENTMARK表上插入记录时调用触发器,则必须在STUDENTMARK表上定义触发器!