5

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

1 に答える 1

9

「追加する必要があります」に応じて。簡単な答えはNOです。

違いは

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_subscriptで、はパーツの同じデータ型の変数ですindex by

また、ネストされたテーブルを使用すると、配列に次のデータをすばやく入力できます。

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

一方、配列ごとのインデックスを作成するには、そこに3行必要です。

  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

于 2013-01-16T10:24:34.427 に答える