вставка триггера на ту же таблицу после вставки

oracle plsql triggers

658 просмотра

1 ответ

CREATE TABLE STUDENTS_1
(
NAME VARCHAR2(50)NOT NULL,
DIV VARCHAR2(5) CHECK (DIV IN ('E','F','G')),
MARKS NUMBER CHECK (MARKS <= 600),
GRADE VARCHAR2(5) CHECK (GRADE IN ('A','B','C'))
)

CREATE OR REPLACE TRIGGER MARKS 
BEFORE INSERT OR UPDATE ON STUDENTS_1
FOR EACH ROW 


BEGIN

IF (:NEW.MARKS>500)THEN 
INSERT INTO STUDENTS_1(MARKS,GRADE)VALUES(:NEW.MARKS,'A');

ELSIF (:NEW.MARKS>400 AND:NEW.MARKS<500) THEN 
INSERT INTO STUDENTS_1(MARKS,GRADE)VALUES(:NEW.MARKS,'B');

ELSE (:NEW.MARKS <400 )
INSERT INTO STUDENTS_1(MARKS,GRADE)VALUES(:NEW.MARKS,'C');


END IF ;
END;/

Я бы вставил отметки в эту таблицу, и я хочу, чтобы триггер соответственно выставлял оценки в той же таблице относительно того, какие отметки я ввожу и получаю, not enough values errorкогда делаю это. Поэтому я хотел бы знать, что я делаю это возможно или есть другой способ ??

Автор: Sean T Источник Размещён: 08.11.2019 11:02

Ответы (1)


3 плюса

Есть несколько проблем с этим подходом. Прежде всего, если бы вы могли вставить students_1в триггер вставки students_1, вы бы создали бесконечный цикл. Вы сделаете вставку, запустив триггер, который сделает вставку, которая запустит триггер, который сделает вставку, которая запустит триггер ... Во-вторых, вы, вероятно, хотите установить gradeзначение для текущей строки , а не создавать новую строку. gradeПредположительно относится к markиз ряда вы находитесь в процессе вставки.

Вы , вероятно , просто хотите обновить gradeв :newpseudorecord

FOR EACH ROW
BEGIN
  case when :new.marks < 400
       then :new.grade := 'C';
       when :new.marks between 400 and 500
       then :new.grade := 'B';
       when :new.marks > 500
       then :new.grade := 'A';
   end case;
END;

Если это реальная проблема, а не домашнее задание, требующее триггера, вам, вероятно, нужен виртуальный столбец, gradeкоторый включает вычисление, а не запись триггера для поддержки вычисляемого столбца.

Автор: Justin Cave Размещён: 20.08.2016 08:14
Вопросы из категории :
32x32