奇怪的 PL SQL 无效游标

Posted

技术标签:

【中文标题】奇怪的 PL SQL 无效游标【英文标题】:Wierd PL SQL invalid cursor 【发布时间】:2013-05-03 11:19:59 【问题描述】:

运行以下代码时,我得到一个 ORA-01001:无效游标不确定发生了什么,我将其转换为过程并开始发生;

CREATE OR REPLACE PROCEDURE p_student_from_class_list (p_stu_id IN NUMBER) 
IS
--Declaring a variable --
    v_date date; 

    --Creating a Cursor to find data from using the p_stu_id paramenter--
    CURSOR enrollments_cursor IS
        SELECT enrollment_date, stu_id, class_id, status
        FROM enrollments 
        WHERE stu_id = p_stu_id;


BEGIN
    /*Changing the date so the code looks for the classes for the student 
    which was entered in the bind variable above for the last 10 years*/
    v_date := add_months(SYSDATE, -120);
    FOR v_enrollment_record IN enrollments_cursor
    LOOP 
--Displays the student's enrollment date, class ID and Current Status for each    class >they taken in last 10 years,from the value which was entered in the bind    variable--
        IF v_enrollment_record.enrollment_date 
        between v_date AND SYSDATE THEN
            DBMS_OUTPUT.PUT_LINE('Enrollment Date: '
            ||v_enrollment_record.enrollment_date
            ||' Class ID: '||v_enrollment_record.class_id
            ||' Status: '||v_enrollment_record.status);
        END IF;
    END LOOP;
    --Closing the cursor --
    CLOSE enrollments_cursor;

    --Application Express processes the statement--
    COMMIT; 
    --Telling Application Express the procedure has finished--
END p_student_from_class_list;

  --Anonymous Block to run the Procedure--

BEGIN
    p_student_from_class_list(--Student ID--);
END;

正如我所说,当代码进入程序时它正在工作,但由于某种原因将其创建为程序现在会出现此错误。我一直在绞尽脑汁试图解决这个问题。

【问题讨论】:

【参考方案1】:

对于用作FOR <record> IN <cursor> LOOP 的光标,您不需要手动CLOSE。你只需要CLOSE一个你手动的光标OPENed(然后FETCHed)。

只需删除该行:

    CLOSE enrollments_cursor;

比较FOR LOOP 和OPEN-FETCH-CLOSE pattern 的文档。

【讨论】:

哇,完全没看到!非常感谢你,你的救命稻草=D 没问题。顺便说一句,您可以将v_date 作为parameter to the cursor 传递并在游标的WHERE 子句中使用它;那么你就不需要循环内的IF 感谢您提供的信息 :) 由于被要求输入变量,因此在问题中设置了变量。不幸的是,没有告知要输入日期~

以上是关于奇怪的 PL SQL 无效游标的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 无效游标错误

PL/SQL:游标使用中的 ORA-01001

如何使用 pl/sql 中的游标将多列数据插入包含单列的表中?

游标问题和语法 PLSQL

PL/SQL编程_游标

PL/SQL轻量版——游标与异常处理