Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql update语句在而不是触发器oracle11g中不起作用_Sql_Database_Triggers_Oracle11g - Fatal编程技术网

Sql update语句在而不是触发器oracle11g中不起作用

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

A) 编写PL/SQL触发器以更新“studentMark”表中的总计 当insert发生在同一个表中时。 查询:


我试了很多次。它插入了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表上定义触发器!