5

2 回目の一括収集の後、データが最初の一括収集を上書きしないようにする方法はありますか。ループで繰り返したくありません。

    DECLARE
       TYPE abc IS RECORD (p_id part.p_id%TYPE);

       TYPE abc_nt
       IS
          TABLE OF abc
             INDEX BY BINARY_INTEGER;

       v_abc_nt      abc_nt;
    BEGIN
       SELECT   p_id
         BULK   COLLECT
         INTO   v_abc_nt
         FROM   part
        WHERE   p_id IN ('E1', 'E2');

       SELECT   p_id
         BULK   COLLECT
         INTO   v_abc_nt
         FROM   part
        WHERE   p_id IN ('E3', 'E4');

       FOR i IN v_abc_nt.FIRST .. v_abc_nt.LAST
       LOOP
          DBMS_OUTPUT.put_line (
             'p_id is ' || v_abc_nt (i).p_id
          );
       END LOOP;
    END;

出力:

  • p_id は E3
  • p_id は E4 です

注: E1 と E2 は部品テーブルにあります。

4

2 に答える 2

11

コレクションにデータを単純に追加することはできません。

ただし、BULK COLLECT別のコレクションに a を実行してから、連想配列ではなくネストされたテーブルが本当に必要/必要であると仮定して、コレクションを組み合わせることができます...

DECLARE
   TYPE abc IS RECORD (p_id part.p_id%TYPE);

   TYPE abc_nt
   IS
      TABLE OF abc;

   v_abc_nt       abc_nt;
   v_abc_nt2      abc_nt;
BEGIN
   SELECT   p_id
     BULK   COLLECT
     INTO   v_abc_nt
     FROM   part
    WHERE   p_id IN ('E1', 'E2');

   SELECT   p_id
     BULK   COLLECT
     INTO   v_abc_nt2
     FROM   part
    WHERE   p_id IN ('E3', 'E4');

   v_abc_nt := v_abc_nt MULTISET UNION v_abc_nt2;

   FOR i IN v_abc_nt.FIRST .. v_abc_nt.LAST
   LOOP
      DBMS_OUTPUT.put_line (
         'p_id is ' || v_abc_nt (i).p_id
      );
   END LOOP;
END;

連想配列を本当に使用したい場合は、いくつかのコードを記述する必要があります。これは、ある配列を同じキーのいくつかを持つ別の連想配列と組み合わせるときに、その配列の関連付けを再マップする方法を Oracle が自動的に認識する方法がないためです。 .

于 2012-11-14T16:05:06.630 に答える