2013-05-03 62 views
0

當運行下面的代碼時,我得到一個ORA-01001:無效光標不知道發生了什麼,我將它轉換爲一個過程並開始發生;Wierd PL SQL無效光標

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; 

正如我所說的代碼,當它在一個過程,但由於某種原因,創建它作爲一個過程,現在給出了這樣的錯誤是得到了工作。我一直在試圖解決這個問題。

回答

2

對於您用作FOR <record> IN <cursor> LOOP的遊標,您不需要手冊CLOSE。你只需要CLOSE一個你手動的光標OPEN ed(然後FETCH ed)。

只是刪除行:

CLOSE enrollments_cursor; 

比較的文檔FOR LOOPOPEN-FETCH-CLOSE pattern

+0

哇完全沒有看到!非常感謝你,你的救星= D – Phyore 2013-05-03 11:29:04

+0

沒問題。順便提一句,您可以將'v_date'作爲[光標參數](http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/static.htm#CIHFAHFE)並將其用於光標的' WHERE條款;那麼你不需要循環內的IF。 – 2013-05-03 11:34:55

+0

謝謝你的信息:)由於被要求輸入他們的問題,這些問題被設置在問題中。不幸的是,日期並沒有被告知輸入〜 – Phyore 2013-05-03 15:15:31