Aleksej有一個很好的答案使用隱式遊標儘可能 - 隱式遊標自動關閉,簡潔易讀。對於您的示例,隱式遊標是推薦的方法。
我會在這裏添加一些額外的例子,符合etsa的回答 只是爲您的原始文章中使用顯式光標的替代品。
如果你想停止循環,你需要在你的LOOP
退出條件。 明確您可以在您的計數器達到特定值時退出,或者CURSOR已被取消或您喜歡的任何其他條件退出。
實施例1與顯式遊標 - 退出循環當光標運行的數據:
創建測試表:
CREATE TABLE MY_TABLE(MY_TABLE_DATA NUMBER);
並加載:
INSERT INTO MY_TABLE SELECT ROWNUM FROM ALL_OBJECTS WHERE ROWNUM < 100;
然後創建你的程序:
CREATE OR REPLACE PROCEDURE TEST_PROD IS
QUERY_STR VARCHAR2(200);
I INTEGER := 0;
TYPE CUR IS REF CURSOR;
V_MY_TABLE_DATA MY_TABLE%ROWTYPE;
MY_CUR CUR;
BEGIN
QUERY_STR := 'SELECT * FROM MY_TABLE WHERE ROWNUM<=5';
OPEN MY_CUR FOR QUERY_STR;
DBMS_OUTPUT.PUT_LINE('START');
LOOP
FETCH MY_CUR INTO V_MY_TABLE_DATA;
EXIT WHEN MY_CUR%NOTFOUND;
I := I + 1;
DBMS_OUTPUT.PUT_LINE('I: ' || I);
DBMS_OUTPUT.PUT_LINE('MY-TABLE-DATA: ' || V_MY_TABLE_DATA.MY_TABLE_DATA);
END LOOP;
DBMS_OUTPUT.PUT_LINE('COUNT: ' || I);
CLOSE MY_CUR;
END;
/
和嘗試:
BEGIN
TEST_PROD();
END;
/
START
I: 1
MY-TABLE-DATA: 1
I: 2
MY-TABLE-DATA: 2
I: 3
MY-TABLE-DATA: 3
I: 4
MY-TABLE-DATA: 4
I: 5
MY-TABLE-DATA: 5
COUNT: 5
或者,你可以停止循環基於I
:
CREATE OR REPLACE PROCEDURE TEST_PROD IS
QUERY_STR VARCHAR2(200);
I INTEGER := 0;
TYPE CUR IS REF CURSOR;
V_MY_TABLE_DATA MY_TABLE%ROWTYPE;
MY_CUR CUR;
BEGIN
QUERY_STR := 'SELECT * FROM MY_TABLE WHERE ROWNUM<=10';
OPEN MY_CUR FOR QUERY_STR;
DBMS_OUTPUT.PUT_LINE('START');
LOOP
IF I >= 3 THEN
EXIT;
END IF;
FETCH MY_CUR INTO V_MY_TABLE_DATA;
I := I + 1;
DBMS_OUTPUT.PUT_LINE('I: ' || I);
DBMS_OUTPUT.PUT_LINE('MY-TABLE-DATA: ' || V_MY_TABLE_DATA.MY_TABLE_DATA);
END LOOP;
DBMS_OUTPUT.PUT_LINE('COUNT: ' || I);
CLOSE MY_CUR;
END;
/
BEGIN
TEST_PROD();
END;
/
START
I: 1
MY-TABLE-DATA: 661
I: 2
MY-TABLE-DATA: 662
I: 3
MY-TABLE-DATA: 663
COUNT: 3
你的循環沒有結束條件。我無法想象它是如何停在3014。我猜測你想用光標做點什麼。這通常就是爲什麼設立這樣一個循環。 –
btw你不需要'TYPE cur IS REF CURSOR;'因爲Oracle已經提供'sys_refcursor'。 –