Вставка данных после создания курсора с ограниченным выделением оракула

Это моя первая публикация на Stack Overflow. Обычно я просто ищу предыдущие вопросы и нахожу свои ответы, но в этом случае я не могу найти ответ на свой вопрос ни здесь, ни в более широком Интернете.

У меня проблема в том, что я хочу заполнить таблицу ссылок "многие ко многим", используемую для автоматического сохранения посещаемости. Когда новый студент добавляется в курс, студенты StudentNo и каждый соответствующий урок LessonNo будут занесены в таблицу ссылок в качестве первичных ключей. Кроме того, код посещаемости учащегося будет автоматически установлен на "Т", чтобы показать, что посещаемость должна быть подтверждена.

Я не хочу, чтобы это было процедурой, так как в базе данных ожидается более 6000 активных записей StudentNo, причем для каждого студента применимо более ста уроков. Только домашние студенты (их определение, а не мое) посещают колледж. Первичный ключ homeStudent идентичен общему первичному ключу студента.

Мой триггер выглядит следующим образом:

CREATE OR REPLACE TRIGGER Student_Added_to_Course
AFTER INSERT ON HomeStudent
FOR EACH ROW
DECLARE 
CURSOR applicable_lessons
IS
   Select Student.studentNo, Lesson.LessonNo
   FROM
   Student, Lesson, Course, Module
   WHERE
   Student.StudentNo = :new.studentNo
   AND
   Student.CourseNo = Course.CourseNo
   AND
   Course.CourseNo = Module.CourseNo
   AND
   Lesson.ModuleNo = Module.ModuleNo;
BEGIN
 FOR I IN applicable_lessons
 LOOP
 INSERT INTO Attendance (StudentNo, LessonNo, AttendanceCode)
 VALUES (I.student.studentNo, I.Lesson.LessonNo, 'T');
  END LOOP;
END;
/

Я получаю следующие ошибки:

Строка 18: оператор SQL игнорируется Строка 19: компонент "Урок" должен быть объявлен Строка 19: столбец здесь запрещен

Поскольку все мои ошибки происходят со строки 18 и далее, я предполагаю, что допустил ошибку во время цикла вставки?

Может ли кто-нибудь сказать мне, что я делаю здесь не так. Я предполагаю, что исправление довольно простое, но я немного косоглазый, глядя на свою работу и не могу найти ошибку.

Заранее спасибо, Бобрек

2 ответа

Решение

Если вы измените INSERT заявление к

INSERT INTO Attendance (StudentNo, LessonNo, AttendanceCode)
VALUES (I.studentNo, I.LessonNo, 'T');

тебе должно быть хорошо.

Потому что переменная курсора i и курсор выбирает studentno а также lessonno колонны; не имеет значения (больше), к какой таблице они принадлежат - вы ссылаетесь на них по имени переменной курсора, т.е. i.studentno а также i.lesonno,

Зачем зацикливать курсор, когда вы можете просто сделать один оператор вставки? Это будет быстрее!

Например:

CREATE OR REPLACE TRIGGER Student_Added_to_Course
AFTER INSERT ON HomeStudent
FOR EACH ROW
BEGIN

  INSERT INTO attendance (studentno, lessonno, attendancecode)
  SELECT s.studentno,
         l.lessonno,
         'T'
  FROM   student s
         INNER JOIN course c ON s.courseno = c.courseno
         INNER JOIN module m ON c.courseno = m.courseno
         INNER JOIN lesson l ON m.moduleno = l.moduleno
  WHERE  s.studentno = :new.studentno;

END Student_Added_to_Course;
/

Обратите внимание, что я изменил ваш синтаксис объединения, чтобы использовать синтаксис объединения ANSI, и обратите внимание, как намного проще увидеть, как связаны таблицы.

Другие вопросы по тегам