ВЫБЕРИТЕ *DISTINCT* с помощью Oracle CURSOR и BULK COLLECT TO

Предположим, я использую следующий код:

  TYPE tb_MY_TABLE
  IS
     TABLE OF MY_TABLE%ROWTYPE
        INDEX BY PLS_INTEGER;

  tb_c3_MY_TABLE          tb_MY_TABLE;

  CURSOR c3_MY_TABLE (
     p3_IDENTIFIER_01   IN            VARCHAR2,
     p3_IDENTIFIER_02   IN            VARCHAR2
  )
  IS
     SELECT    IDENTIFIER_01,
               IDENTIFIER_02,
               STRING_01,
               STRING_02,
               STRING_03
       FROM   MY_TABLE
      WHERE   MY_TABLE.IDENTIFIER_01 = p3_IDENTIFIER_01
              AND MY_TABLE.IDENTIFIER_02 = p3_IDENTIFIER_02;

  OPEN c3_MY_TABLE (v_IDENTIFIER_01, v_IDENTIFIER_02);

  FETCH c3_MY_TABLE BULK COLLECT INTO   tb_c3_MY_TABLE;

  CLOSE c3_MY_TABLE;

  BEGIN
    FOR v_INDX_TER IN 1 .. tb_c3_MY_TABLE.COUNT

      LOOP
        ----- .....
      END LOOP;

  END;

Как мне изменить код, если c3_MY_TABLE находится в SELECT DISTINCT IDENTIFIER_01, IDENTIFIER_02 FROM MY_TABLE?

  CURSOR c3_MY_TABLE (
     p3_IDENTIFIER_01   IN            VARCHAR2,
     p3_IDENTIFIER_02   IN            VARCHAR2
  )
  IS
     SELECT    DISTINCT IDENTIFIER_01,
                        IDENTIFIER_02
       FROM   MY_TABLE
      WHERE   MY_TABLE.IDENTIFIER_01 = p3_IDENTIFIER_01
              AND MY_TABLE.IDENTIFIER_02 = p3_IDENTIFIER_02;

Заранее благодарим вас за ваши добрые предложения!


person UltraCommit    schedule 23.01.2014    source источник
comment
вы хотите сделать вывод в tb_c3_MY_TABLE общим? или вам нужен набор результатов вашего предыдущего запроса с различными их значениями?   -  person Maheswaran Ravisankar    schedule 23.01.2014
comment
Мне нужен набор результатов с разными значениями. Обратите внимание, что у курсора c3 всего 2 поля, а у my_table 5 полей. Как мне изменить код, чтобы иметь право использовать select DISTINCT?   -  person UltraCommit    schedule 23.01.2014
comment
Если не принимать во внимание столбцы в таблице, DISTINCT сделает resultset имеющим разные значения. вам не нужны данные в других столбцах?   -  person Maheswaran Ravisankar    schedule 23.01.2014
comment
В яблочко! Мне не нужны данные в остальных столбцах, в курсоре c3.   -  person UltraCommit    schedule 23.01.2014
comment
Тогда то, что вы когда-либо публиковали, уже идеально!   -  person Maheswaran Ravisankar    schedule 23.01.2014
comment
Обратите внимание, что DISTINCT появляется для всей строки SELECT, а не только для первого столбца.   -  person Maheswaran Ravisankar    schedule 23.01.2014
comment
Этот оператор дает ошибку с определенным: FETCH c3_MY_TABLE BULK COLLECT INTO tb_c3_MY_TABLE;   -  person UltraCommit    schedule 23.01.2014
comment
Измените объявление под CURSOR, например tb_c3_MY_TABLE c3_MY_TABLE%ROWTYPE;   -  person Maheswaran Ravisankar    schedule 23.01.2014
comment
Я не могу преобразовать c3_MY_TABLE (с двумя отдельными столбцами) в tb_c3_MY_TABLE (с 5 столбцами), используя BULK COLLECT TO.   -  person UltraCommit    schedule 23.01.2014


Ответы (1)


Пожалуйста, измените свое объявление (в блоке DECLARE) следующим образом, и все готово. DISTINCT применяется ко всей строке, которую вы SELECT не принимаете во внимание, фактически, в ТАБЛИЦЕ. Это происходит только после процесса отбора.

CURSOR c3_MY_TABLE (
     p3_IDENTIFIER_01   IN            VARCHAR2,
     p3_IDENTIFIER_02   IN            VARCHAR2
  )
  IS
     SELECT    DISTINCT IDENTIFIER_01,
                        IDENTIFIER_02
       FROM   MY_TABLE
      WHERE   MY_TABLE.IDENTIFIER_01 = p3_IDENTIFIER_01
              AND MY_TABLE.IDENTIFIER_02 = p3_IDENTIFIER_02;


TYPE TY_ROW IS RECORD
(
   IDENTIFIER_01 MY_TABLE.IDENTIFIER_01%TYPE,
   IDENTIFIER_02 MY_TABLE.IDENTIFIER_02%TYPE
);

TYPE TY_TABLE is TABLE OF TY_ROW;

tb_c3_MY_TABLE TY_TABLE;
person Maheswaran Ravisankar    schedule 23.01.2014
comment
PLS-00497: нельзя смешивать однорядные и многострочные (BULK) в списке INTO - person UltraCommit; 23.01.2014
comment
Я объявил как тип Single Record. Вот почему.. Отредактировано! - person Maheswaran Ravisankar; 23.01.2014
comment
Спасибо, это работает, я был без ума от этого :-) Ответ принят! :-) - person UltraCommit; 23.01.2014