2013-01-16 76 views
0

添加INDEX BY PLS_INTEGER而不是在新表類型的聲明結束時有什麼不同。看看這個例子:Oracle 11g:當將新的TYPE聲明爲TABLE時,是否必須添加「INDEX BY PLS_INTEGER」?

DECLARE 
    GC_BULK_LIMIT CONSTANT INTEGER := 500; 
    CURSOR CUR_CLIENTS IS SELECT C.ID, C.NAME FROM CLIENTS C; 
    TYPE RT_CLIENTS IS TABLE OF CUR_CLIENTS%ROWTYPE; 
    -- TYPE RT_CLIENTS IS TABLE OF CUR_CLIENTS%ROWTYPE INDEX BY PLS_INTEGER; 
    LT_CLIENTS RT_CLIENTS; 
BEGIN 
    OPEN CUR_CLIENTS; 
    LOOP 
     FETCH CUR_CLIENTS BULK COLLECT INTO LT_CLIENTS LIMIT GC_BULK_LIMIT; 
     EXIT WHEN LT_CLIENTS.COUNT = 0; 
     FOR I IN 1..LT_CLIENTS.COUNT LOOP 
      -- ... SOME LOGIC 
     END LOOP; 
    END LOOP; 
    CLOSE CUR_CLIENTS; 
END; 

回答

4

迴應「我必須添加」。最簡潔的答案是不。

不同的是,

TYPE RT_CLIENTS IS TABLE OF CUR_CLIENTS%ROWTYPE; 

是嵌套表。這意味着對於這種類型的給定變量,我們知道下標是連續的。即下標從1開始並上升到數組長度。

因此,下面的循環,是訪問一個嵌套表陣列的正確方法:

FOR I IN 1..LT_CLIENTS.COUNT LOOP 

然而,這被稱爲關聯數組:

TYPE RT_CLIENTS IS TABLE OF CUR_CLIENTS%ROWTYPE INDEX BY PLS_INTEGER; 

(你也可以指數由如果你想要的話,可以使用varchar2)。不同之處在於,這種情況下的下標不必是連續的,這取決於數組如何填充。在你的代碼中,他們會(像批量收集那樣),但並非總是如此。

通過index by陣列訪問和迴路中的安全的方法是:

v_subscript := t_arr.first; 
    while v_subscript is not null loop 
    dbms_output.put_line(v_subscript || ': ' || t_arr(v_subscript)); 
    v_subscript := t_arr.next(v_subscript); 
    end loop; 

其中v_subscriptindex by部分的相同的數據類型的變量。

declare 
    type myarr is table of number; 
    t_arr   myarr; 
    v_subscript number; 
begin 
    t_arr := myarr(1, 12, 44); 

而與數組的索引,你得有三條線有填充它:

t_arr(1):= 1; 
    t_arr(2):= 12; 
    t_arr(3):= 44; 

還與嵌套表,您可以快速填充陣列

爲您的特殊情況,沒有index by是完全沒問題。

更多閱讀:http://docs.oracle.com/cd/E18283_01/appdev.112/e17126/composites.htm

相關問題