Вставка данных после создания курсора с ограниченным выделением оракула - PullRequest
0 голосов
/ 07 февраля 2019

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

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

Я не хочу, чтобы это была процедура, поскольку в базе данных ожидается более 6000 активных записей учеников нет, причем более ста уроков применимо к каждому ученику.Только домашние студенты (их определение, а не мое) посещают колледж.Первичный ключ 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 ]

0 голосов
/ 08 февраля 2019

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

Например:

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, и обратите внимание, как намного проще увидеть, как связаны таблицы.

0 голосов
/ 07 февраля 2019

Если вы измените оператор INSERT на

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

, то все будет хорошо.

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

...