oracle 自定义 string_agg
时间: 2023-10-23 20:12:05 浏览: 238
解决Oracle没有WM_CONCAT函数.zip
在 Oracle 数据库中,可以使用 LISTAGG 函数来实现字符串聚合。如果需要自定义字符串聚合函数,可以使用 PL/SQL 编写一个自定义聚合函数。
下面是一个示例代码,实现了一个自定义的字符串聚合函数 STRAGG:
```
CREATE OR REPLACE TYPE t_stragg
AS OBJECT (
str_agg VARCHAR2(32767),
STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT t_stragg)
RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateIterate(self IN OUT t_stragg,
value IN VARCHAR2) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateTerminate(self IN t_stragg,
returnValue OUT VARCHAR2, flags IN NUMBER) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT t_stragg,
ctx2 IN t_stragg) RETURN NUMBER
);
CREATE OR REPLACE TYPE BODY t_stragg
IS
STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT t_stragg)
RETURN NUMBER
IS
BEGIN
sctx := t_stragg(NULL);
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateIterate(self IN OUT t_stragg,
value IN VARCHAR2) RETURN NUMBER
IS
BEGIN
IF self.str_agg IS NULL THEN
self.str_agg := value;
ELSE
self.str_agg := self.str_agg || ',' || value;
END IF;
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateTerminate(self IN t_stragg,
returnValue OUT VARCHAR2, flags IN NUMBER) RETURN NUMBER
IS
BEGIN
returnValue := self.str_agg;
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT t_stragg,
ctx2 IN t_stragg) RETURN NUMBER
IS
BEGIN
IF ctx2.str_agg IS NOT NULL THEN
IF self.str_agg IS NULL THEN
self.str_agg := ctx2.str_agg;
ELSE
self.str_agg := self.str_agg || ',' || ctx2.str_agg;
END IF;
END IF;
RETURN ODCIConst.Success;
END;
END;
CREATE OR REPLACE FUNCTION stragg(input VARCHAR2)
RETURN VARCHAR2
PARALLEL_ENABLE AGGREGATE USING t_stragg;
```
使用方法如下:
```
SELECT stragg(column_name) FROM table_name;
```
其中,column_name 是要聚合的列名,table_name 是要聚合的表名。
阅读全文