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