簡體   English   中英

在Oracle數據庫中使用游標將表數據獲取到Varray

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM