这是我第一次在Stack Overflow上发帖。我通常只搜索先前的问题并找到答案,但是在这种情况下,无论是在这里还是在更广泛的互联网上,我似乎都找不到我的问题的答案。
我遇到的问题是,我想填充用于自动存储考勤的多对多链接表。当新学生添加到课程中时,学生的StudentNo和每个适用的Lessons的LessonNo将作为主键输入到链接表中。此外,学生的出勤代码将自动设置为“ T”,以表明该出勤待确认。
我不希望这是一个过程,因为数据库希望有6,000多名活跃学生没有条目,每位学生有一百多堂课适用。只有家庭学生(他们的定义,不是我的)上大学。 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行开始发生的,我以为我在插入循环中犯了一个错误?
有人可以告诉我我在做什么错。我认为解决方法相当简单,但是我有点cross目结舌地看着自己的作品,找不到错误。
预先感谢您, 博布雷克
答案 0 :(得分:1)
如果将INSERT
语句更改为
INSERT INTO Attendance (StudentNo, LessonNo, AttendanceCode)
VALUES (I.studentNo, I.LessonNo, 'T');
你应该很好。
因为,游标变量为i
,并且游标选择了studentno
和lessonno
列;它们属于哪个表都无所谓了-您可以通过游标变量的名称(即i.studentno
和i.lesonno
来引用它们。
答案 1 :(得分:0)
为什么只可以执行一个插入语句就遍历游标?那会更快!
例如:
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连接语法,并注意查看表如何链接要容易得多。