奇怪的 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
一个你手动的光标OPEN
ed(然后FETCH
ed)。
只需删除该行:
CLOSE enrollments_cursor;
比较FOR LOOP 和OPEN-FETCH-CLOSE pattern 的文档。
【讨论】:
哇,完全没看到!非常感谢你,你的救命稻草=D 没问题。顺便说一句,您可以将v_date
作为parameter to the cursor 传递并在游标的WHERE
子句中使用它;那么你就不需要循环内的IF
。
感谢您提供的信息 :) 由于被要求输入变量,因此在问题中设置了变量。不幸的是,没有告知要输入日期~以上是关于奇怪的 PL SQL 无效游标的主要内容,如果未能解决你的问题,请参考以下文章