- 论坛徽章:
- 0
|
- create or replace type connstrImpl as object
- (
- currentstr varchar2(4000),
- currentseprator varchar2(8),
- static function ODCIAggregateInitialize(sctx IN OUT connstrImpl)
- return number,
- member function ODCIAggregateIterate(self IN OUT connstrImpl,
- value IN VARCHAR2) return number,
- member function ODCIAggregateTerminate(self IN connstrImpl,
- returnValue OUT VARCHAR2, flags IN number) return number,
- member function ODCIAggregateMerge(self IN OUT connstrImpl,
- ctx2 IN connstrImpl) return number
- );
- /
- create or replace type body connstrImpl is
- static function ODCIAggregateInitialize(sctx IN OUT connstrImpl)
- return number is
- begin
- sctx := connstrImpl('','/');
- return ODCIConst.Success;
- end;
- member function ODCIAggregateIterate(self IN OUT connstrImpl, value IN VARCHAR2) return number is
- begin
- if self.currentstr is null then
- self.currentstr := value;
- else
- self.currentstr := self.currentstr ||currentseprator || value;
- end if;
- return ODCIConst.Success;
- end;
- member function ODCIAggregateTerminate(self IN connstrImpl, returnValue OUT VARCHAR2, flags IN number) return number is
- begin
- returnValue := self.currentstr;
- return ODCIConst.Success;
- end;
- member function ODCIAggregateMerge(self IN OUT connstrImpl, ctx2 IN connstrImpl) return number is
- begin
- if ctx2.currentstr is null then
- self.currentstr := self.currentstr;
- elsif self.currentstr is null then
- self.currentstr := ctx2.currentstr;
- else
- self.currentstr := self.currentstr || currentseprator || ctx2.currentstr;
- end if;
- return ODCIConst.Success;
- end;
- end;
- /
- CREATE OR REPLACE FUNCTION connstr (input VARCHAR2) RETURN VARCHAR2
- PARALLEL_ENABLE AGGREGATE USING connstrImpl;
- /
复制代码
使用示例如下:
- SQL> select connstr(loc) from dept ;
- CONNSTR(LOC)
- --------------------------------------------------------------------------------
- NEW YORK/DALLAS/CHICAGO/BOSTON
复制代码
参考了
Oracle® Data Cartridge Developer's Guide 10g Release 1 (10.1) User-Defined Aggregate Functions |
|