Oracle 11g : Bei der Deklaration der neue TYP als TABELLE, muss ich hinzufügen "INDEX BY PLS_INTEGER"?
Was ist der diffecence zwischen hinzufügen INDEX BY PLS_INTEGER
und nicht am Ende der Erklärung der neuen Tabelle. Schauen Sie auf dieses Beispiel:
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;
Du musst angemeldet sein, um einen Kommentar abzugeben.
Antwort auf "muss ich hinzufügen". Die kurze Antwort ist NEIN.
der Unterschied ist, dass
Ist eine verschachtelte Tabelle. Dies bedeutet, dass für eine gegebene variable von diesem Typ ist, wissen wir, dass die Indizes der Reihe nach. d.h. der index fängt von 1 an und geht bis zu der array-Länge.
Folgende Schleife ist daher der richtige Weg, um den Zugriff auf eine verschachtelte Tabelle-array:
Diese jedoch genannt ist ein assoziatives array:
(man könnte auch index einer
varchar2
wenn Sie wollte). Der Unterschied ist, dass die Indizes in diesem Fall müssen nicht fortlaufend sein, je nachdem, wie das array war gefüllt. In Ihrem code, Sie wäre (als bulk sammeln würde das tun), aber es ist nicht immer der Fall.Den sicheren Weg zu Zugang und Durchlaufen einer
index by
array ist :wo
v_subscript
ist eine variable mit dem gleichen Datentyp desindex by
Teil.auch mit einer verschachtelten Tabelle, können Sie das array zu füllen schnell mit:
in der Erwägung, dass mit einem index von array-man müsste drei Linien, die es zu füllen:
für Ihren speziellen Fall, ohne die
index by
ist völlig in Ordnung.weiter Lesen: http://docs.oracle.com/cd/E18283_01/appdev.112/e17126/composites.htm