收集到SQL语句中的VARRAY

时间:2013-11-29 13:23:20

标签: oracle group-concat varray

我有以下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);

最后我有一个函数可以收到IDS和NUMBER类型的2个参数。有没有办法可以将ID列收集到一个IDS变量中,将它们分组到OC_YEAR列下,并将这两个参数发送给我的函数。为了更清楚,我需要将上述查询的结果集分组如下:

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

不完全是类似于MySQL中的GROUP_CONCAT。

2 个答案:

答案 0 :(得分:2)

Oracle 11.2引入了函数LISTAGG,它与GROUP_CONCAT一样。如果您没有可用的Oracle 11.2,则必须将其封装在函数中。

答案 1 :(得分:1)

重复this one:

如果你有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;