Сбор в VARRAY внутри оператора SQL

У меня есть следующий SQL-запрос:

SELECT ID, OC_YEAR FROM ACCOUNTS;

Этот запрос возвращает следующий набор результатов:

       ID       |     OC_YEAR          
------------------------------------    
       10            2006
       10            2007
       10            2008
       11            2006
       11            2008

С другой стороны, у меня есть пользовательский тип

 create TYPE IDS AS VARRAY(10) OF NUMBER(5);

И, наконец, у меня есть функция, которая получает 2 параметра типа IDS и NUMBER. Есть ли способ собрать столбцы идентификаторов в переменную IDS, сгруппировав их в столбце OC_YEAR, и отправить эти два аргумента в мою функцию. Чтобы было понятнее, мне нужно сгруппировать набор результатов вышеуказанного запроса следующим образом:

(10,11):2006
(10):2007
(10,11):2008

Не совсем, но что-то похожее на GROUP_CONCAT в MySQL.


person Mikayil Abdullayev    schedule 29.11.2013    source источник
comment
Как я уже сказал, я не ищу точный эквивалент GROUP_CONCAT.   -  person Mikayil Abdullayev    schedule 29.11.2013
comment
Ответ почти тот же ;-)   -  person Armunin    schedule 29.11.2013


Ответы (2)


Дубликат этого:

Если у вас есть Oracle 10G:

CREATE OR REPLACE FUNCTION GET_COMMA_SEPARATED_VALUE ( INPUT_VAL IN NUMBER )
    RETURN VARCHAR2
IS
    RETURN_TEXT VARCHAR2 ( 10000 ) := NULL;
BEGIN
    FOR X IN ( SELECT
                  ID
            FROM
                  ACCOUNTS
            WHERE
                  OC_YEAR = INPUT_VAL )
    LOOP
        RETURN_TEXT :=
               RETURN_TEXT
            || ','
            || X.ID;
    END LOOP;

    RETURN LTRIM ( RETURN_TEXT,
                ',' );
END;
/

Итак, вы можете сделать так:

SELECT
      GET_COMMA_SEPARATED_VALUE ( ID ),
      OC_YEAR
FROM
      ACCOUNTS;

Если у вас есть oracle 11g, вы можете использовать listagg :

SELECT
      LISTAGG ( OC_YEAR,
              ', ' )
      WITHIN GROUP (ORDER BY ID),
      OC_YEAR
FROM
      ACCOUNTS
GROUP BY
      OC_YEAR;
person SriniV    schedule 29.11.2013
comment
Я думаю, что в вашем коде 10g есть ошибка. Разве функция не должна ожидать OC_YEAR в качестве параметра? - person Armunin; 29.11.2013
comment
Спасибо за комментарий. исправленный - person SriniV; 29.11.2013

В Oracle 11.2 появилась функция LISTAGG, которая выполняет то же, что и GROUP_CONCAT. Если у вас нет Oracle 11.2, вы должны инкапсулировать его в функцию.

person Wernfried Domscheit    schedule 29.11.2013