【问题标题】:SQL error - Cursor malformed or incompleteSQL 错误 - 游标格式错误或不完整
【发布时间】:2017-07-21 16:59:29
【问题描述】:

我的目标是让嵌套光标在循环中运行,以便显示部分名称和编号,然后显示该部分中的所有人员。

首先是代码。

SET SERVEROUTPUT ON SIZE 4000

DECLARE
  search VARCHAR2(20) := 'Summer 2007';
  CURSOR cur_class IS
    SELECT call_id, sec_num, c_sec_id
    FROM course_section
    INNER JOIN course ON course_section.course_id = course.course_id
    INNER JOIN term ON course_section.term_id = term.term_id
    WHERE term.term_desc = search
    ORDER BY course.call_id;
  f_cur cur_class%ROWTYPE;
  CURSOR cur_students IS
    SELECT c_sec_id, s_first, s_last
    FROM enrollment
    INNER JOIN student ON enrollment.s_id = student.s_id
    INNER JOIN course_section ON enrollment.c_sec_id = course_section.c_sec_id
    WHERE enrollment.c_sec_id IS NOT NULL;
  f_cur_stu cur_students%ROWTYPE;

BEGIN
  OPEN cur_class;
  LOOP
    FETCH cur_class INTO f_cur;
    EXIT WHEN cur_class%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(f_cur.call_id || ' Sec. ' || f_cur.sec_num);
      FOR f_cur_stu IN cur_students LOOP
        IF f_cur.c_sec_id = f_cur_stu.c_sec_id THEN
          DBMS_OUTPUT.PUT_LINE(f_cur_stu.s_first || ' ' || f_cur_stu.s_last);
        END IF;
      END LOOP;
    END LOOP;
    CLOSE cur_class;
END;

这是错误信息:

Error report:
ORA-06550: line 16, column 11:
PL/SQL: ORA-00918: column ambiguously defined
ORA-06550: line 12, column 5:
PL/SQL: SQL Statement ignored
ORA-06550: line 11, column 10:
PLS-00341: declaration of cursor 'CUR_STUDENTS' is incomplete or malformed
ORA-06550: line 17, column 13:
PL/SQL: Item ignored
ORA-06550: line 26, column 29:
PLS-00364: loop index variable 'F_CUR_STU' use is invalid
ORA-06550: line 26, column 9:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

如果我注释掉整个第二个光标创建和嵌套循环,第一个循环会起作用,并根据需要为我列出部分名称和编号。

当我尝试第二个光标 cur_students 时出现问题。我不知道光标是如何格式错误/不完整的,以及我可以做些什么来完成它。我尝试过其他 WHERE 子句,但总是一样。

编辑:表结构的图片:

【问题讨论】:

    标签: cursor oracle-sqldeveloper malformed


    【解决方案1】:

    通常的怀疑是您的表enrollment 没有名为c_sec_id 的列。

    可以分享一下表结构吗?

    【讨论】:

    • 您好,感谢您的评论!我上传了表结构,但正如 fg78nc 在下面回答的那样。但我明白您为什么建议可能是注册表中不存在 c_sec_id 。感谢您的帮助和时间。
    【解决方案2】:

    1) SELECT c_sec_id, s_first, s_last

    c_sec_id 列存在于enrollmentcourse_section 表中。您必须在它前面加上表名,即enrollment.c_sec_idcourse_section.c_sec_id,否则编译器不清楚您要从上述哪个表中检索它。

    2) f_cur_stu cur_students%ROWTYPE;

    您不需要此声明,因为FOR f_cur_stu IN cur_students LOOP 中的f_cur_stu 是由游标循环本身隐式创建的变量。

    【讨论】:

    • 谢谢!就是这样!我没有意识到我需要在 SELECT 语句中指定 course_section.c_sec_id。我的意思是,一旦我想到它并大声说出来,它就很有意义。再次感谢你!一旦我添加了“course_section”。到 c_sec_id 前面,它工作得很好,没有错误。
    猜你喜欢
    • 2021-03-29
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 2017-10-21
    相关资源
    最近更新 更多