在 SQL 语句中收集到 VARRAY [重复]
Posted
技术标签:
【中文标题】在 SQL 语句中收集到 VARRAY [重复]【英文标题】:Collecting into VARRAY inside SQL statement [duplicate] 【发布时间】:2013-11-29 13:23:19 【问题描述】:我有以下 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 的参数。有没有办法可以将 ID 列收集到 IDS 变量中,将它们分组到 OC_YEAR 列下,并将这两个参数发送到我的函数。为了更清楚,我需要像这样对上述查询的结果集进行分组:
(10,11):2006
(10):2007
(10,11):2008
不完全是,但类似于 mysql 中的 GROUP_CONCAT。
【问题讨论】:
正如我所说,我不是在寻找 GROUP_CONCAT 的完全等价物 答案还是差不多的 ;-) 【参考方案1】:Oracle 11.2 引入了函数LISTAGG,其作用与 GROUP_CONCAT 相同。如果您没有可用的 Oracle 11.2,则必须将其封装在一个函数中。
【讨论】:
【参考方案2】: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;
【讨论】:
我认为你的 10g 代码有错误。函数不应该期望OC_YEAR
作为参数吗?
感谢您的评论。更正以上是关于在 SQL 语句中收集到 VARRAY [重复]的主要内容,如果未能解决你的问题,请参考以下文章
在 PL/SQL VARRAY 中使用 ROWTYPE 会产生编译错误
我应该如何使用 jdbc 从 plsql 将 varray 发送到 java? [复制]