使用受限选择Oracle创建游标后插入数据

时间:2019-02-07 20:32:25

标签: oracle plsql oracle11g database-trigger

这是我第一次在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目结舌地看着自己的作品,找不到错误。

预先感谢您, 博布雷克

2 个答案:

答案 0 :(得分:1)

如果将INSERT语句更改为

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

你应该很好。

因为,游标变量为i,并且游标选择了studentnolessonno列;它们属于哪个表都无所谓了-您可以通过游标变量的名称(即i.studentnoi.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连接语法,并注意查看表如何链接要容易得多。