[英]Fetching Table Data with Cursor to a Varray in oracle database
我有一個名為PhoneBook的表,該表具有以下屬性:ID,FirstName,LastName。 它有5條記錄,我希望創建一個VARRAY並使用Cursor將PhoneBook表中的所有firstName提取到VARRAY中。 這是我的代碼:
DECLARE
v_FirstName PHONEBOOK.FIRSTNAME%TYPE;
TYPE arrayNames IS VARRAY(10) OF VARCHAR2(20);
v1 arrayNames;
i INT := 0;
CURSOR c_phonebook IS SELECT FIRSTNAME FROM PHONEBOOK;
BEGIN
v1 := arrayNames();
OPEN c_phonebook;
LOOP
FETCH c_phonebook INTO v_firstname;
v1(i) := v_firstname;
i := i+1;
EXIT WHEN c_phonebook%NOTFOUND;
END LOOP;
CLOSE c_phonebook;
END;/
當我編譯此代碼時,它給了我一個錯誤:
ORA-06532:下標超出限制ORA-06512:在第14 06532行。00000-“下標超出限制” *原因:下標大於varray的限制,或者對於varray或嵌套表為非正數。 *措施:檢查程序邏輯,並在必要時增加varray的限制。
請幫我解決這個問題。 謝謝
您需要增加數組的大小,每次要添加成員時,創建一個可以填充的空元素:
...
BEGIN
v1 := arrayNames();
OPEN c_phonebook;
LOOP
FETCH c_phonebook INTO v_firstname;
EXIT WHEN c_phonebook%NOTFOUND;
i := i+1;
v1.EXTEND();
v1(i) := v_firstname;
END LOOP;
CLOSE c_phonebook;
END;
請注意,由於數組是從1而不是0索引的,所以我已將i := i+1
移到了賦值之前。我還將EXIT
移到了FETCH
,所以您不要嘗試處理光標的最后一行兩次。
在此示例中,您實際上並不需要i
,可以使用數組的當前COUNT
來標識新添加的條目:
DECLARE
v_FirstName PHONEBOOK.FIRSTNAME%TYPE;
TYPE arrayNames IS VARRAY(10) OF VARCHAR2(20);
v1 arrayNames;
CURSOR c_phonebook IS SELECT FIRSTNAME FROM PHONEBOOK;
BEGIN
v1 := arrayNames();
OPEN c_phonebook;
LOOP
FETCH c_phonebook INTO v_firstname;
EXIT WHEN c_phonebook%NOTFOUND;
v1.EXTEND();
v1(v1.COUNT) := v_firstname;
END LOOP;
CLOSE c_phonebook;
END;
/
我認為這是一種練習; 否則,您可以在集合中使用批量收集,並且不需要顯式游標:
DECLARE
TYPE arrayNames IS VARRAY(10) OF VARCHAR2(20);
v1 arrayNames;
BEGIN
SELECT FIRSTNAME
BULK COLLECT INTO v1
FROM PHONEBOOK;
END;
/
(您可以在查詢中添加一個rownum
檢查,以確保它不會嘗試獲取該數組可以處理的更多行,但是如果發生這種情況,則更適合於出錯。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.