Oracle cartrige 扩展/自定义实现 ListAgg

1.  自定义Cartrige type

CREATE OR REPLACE TYPE zh_concat_im AUTHID CURRENT_USER
AS
  OBJECT
  (
    CURR_STR clob,
    STATIC
  FUNCTION ODCIAGGREGATEINITIALIZE(
      SCTX IN OUT zh_concat_im)
    RETURN NUMBER,
    MEMBER FUNCTION ODCIAGGREGATEITERATE(
      SELF IN OUT zh_concat_im,
      P1   IN VARCHAR2)
    RETURN NUMBER,
    MEMBER FUNCTION ODCIAGGREGATETERMINATE(
      SELF IN zh_concat_im,
      RETURNVALUE OUT CLOB,
      FLAGS IN NUMBER)
    RETURN NUMBER,
    MEMBER FUNCTION ODCIAGGREGATEMERGE(
      SELF  IN OUT zh_concat_im,
      SCTX2 IN zh_concat_im)
    RETURN NUMBER );

 

2. 实现Cartrige Type body

CREATE OR REPLACE TYPE BODY zh_concat_im
IS
  STATIC
FUNCTION ODCIAGGREGATEINITIALIZE(
    SCTX IN OUT zh_concat_im)
  RETURN NUMBER
IS
BEGIN
  SCTX := zh_concat_im(NULL) ;
  RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEITERATE(
    SELF IN OUT zh_concat_im,
    P1   IN VARCHAR2)
  RETURN NUMBER
IS
BEGIN
  IF(CURR_STR IS NOT NULL) THEN
    CURR_STR  := CURR_STR || ',' || P1;
  ELSE
    CURR_STR := P1;
  END IF;
  RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATETERMINATE(
    SELF IN zh_concat_im,
    RETURNVALUE OUT CLOB,
    FLAGS IN NUMBER)
  RETURN NUMBER
IS
BEGIN
  RETURNVALUE := CURR_STR ;
  RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEMERGE(
    SELF  IN OUT zh_concat_im,
    SCTX2 IN zh_concat_im)
  RETURN NUMBER
IS
BEGIN
  IF(SCTX2.CURR_STR IS NOT NULL) THEN
    SELF.CURR_STR   := SELF.CURR_STR || ',' || SCTX2.CURR_STR ;
  END IF;
  RETURN ODCICONST.SUCCESS;
END;
END;

 

3. 自定义函数调用Cartrige type

CREATE OR REPLACE
  FUNCTION zh_concat(
      P1 VARCHAR2)
    RETURN CLOB AGGREGATE USING zh_concat_im ;

 

4. 在SQL 中调用自定义的集合函数

select t.*,zh_concat(employee_name) over(partition by employee_name) from EMPLOYEE_SALARY_T t;

--------------------------------------------------------
--  DDL for Table EMPLOYEE_SALARY_T
--------------------------------------------------------

  CREATE TABLE "SYS"."EMPLOYEE_SALARY_T"
   ( "EMPLOYEE_ID" VARCHAR2(20 BYTE),
 "EMPLOYEE_NAME" VARCHAR2(20 BYTE),
 "DEPARTMENT" VARCHAR2(10 BYTE),
 "COMPANY" VARCHAR2(10 BYTE),
 "SALARY" NUMBER(6,0),
 "SALARY_YEAR" VARCHAR2(10 BYTE)
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SYSTEM" ;
REM INSERTING into SYS.EMPLOYEE_SALARY_T
SET DEFINE OFF;
Insert into SYS.EMPLOYEE_SALARY_T (EMPLOYEE_ID,EMPLOYEE_NAME,DEPARTMENT,COMPANY,SALARY,SALARY_YEAR) values ('001','znp','dep001','VisSoft',30000,'2005');
Insert into SYS.EMPLOYEE_SALARY_T (EMPLOYEE_ID,EMPLOYEE_NAME,DEPARTMENT,COMPANY,SALARY,SALARY_YEAR) values ('001','znp','dep001','VisSoft',40000,'2006');
Insert into SYS.EMPLOYEE_SALARY_T (EMPLOYEE_ID,EMPLOYEE_NAME,DEPARTMENT,COMPANY,SALARY,SALARY_YEAR) values ('001','znp','dep001','VisSoft',50000,'2007');
Insert into SYS.EMPLOYEE_SALARY_T (EMPLOYEE_ID,EMPLOYEE_NAME,DEPARTMENT,COMPANY,SALARY,SALARY_YEAR) values ('001','znp','dep001','VisSoft',60000,'2008');
Insert into SYS.EMPLOYEE_SALARY_T (EMPLOYEE_ID,EMPLOYEE_NAME,DEPARTMENT,COMPANY,SALARY,SALARY_YEAR) values ('002','zsj','dep001','AvsSoft',3000,'2005');
Insert into SYS.EMPLOYEE_SALARY_T (EMPLOYEE_ID,EMPLOYEE_NAME,DEPARTMENT,COMPANY,SALARY,SALARY_YEAR) values ('002','zsj','dep001','AvsSoft',4000,'2006');
Insert into SYS.EMPLOYEE_SALARY_T (EMPLOYEE_ID,EMPLOYEE_NAME,DEPARTMENT,COMPANY,SALARY,SALARY_YEAR) values ('002','zsj','dep001','AvsSoft',5000,'2007');
Insert into SYS.EMPLOYEE_SALARY_T (EMPLOYEE_ID,EMPLOYEE_NAME,DEPARTMENT,COMPANY,SALARY,SALARY_YEAR) values ('002','zsj','dep001','AvsSoft',6000,'2008');
Insert into SYS.EMPLOYEE_SALARY_T (EMPLOYEE_ID,EMPLOYEE_NAME,DEPARTMENT,COMPANY,SALARY,SALARY_YEAR) values ('003','ts1','dep002','VisSoft',30000,'2005');
Insert into SYS.EMPLOYEE_SALARY_T (EMPLOYEE_ID,EMPLOYEE_NAME,DEPARTMENT,COMPANY,SALARY,SALARY_YEAR) values ('003','ts1','dep002','VisSoft',40000,'2006');
Insert into SYS.EMPLOYEE_SALARY_T (EMPLOYEE_ID,EMPLOYEE_NAME,DEPARTMENT,COMPANY,SALARY,SALARY_YEAR) values ('003','ts1','dep002','VisSoft',50000,'2007');
Insert into SYS.EMPLOYEE_SALARY_T (EMPLOYEE_ID,EMPLOYEE_NAME,DEPARTMENT,COMPANY,SALARY,SALARY_YEAR) values ('003','ts1','dep002','VisSoft',60000,'2008');
Insert into SYS.EMPLOYEE_SALARY_T (EMPLOYEE_ID,EMPLOYEE_NAME,DEPARTMENT,COMPANY,SALARY,SALARY_YEAR) values ('004','ts2','dep002','AvsSoft',3000,'2005');
Insert into SYS.EMPLOYEE_SALARY_T (EMPLOYEE_ID,EMPLOYEE_NAME,DEPARTMENT,COMPANY,SALARY,SALARY_YEAR) values ('004','ts2','dep002','AvsSoft',4000,'2006');
Insert into SYS.EMPLOYEE_SALARY_T (EMPLOYEE_ID,EMPLOYEE_NAME,DEPARTMENT,COMPANY,SALARY,SALARY_YEAR) values ('004','ts2','dep002','AvsSoft',5000,'2007');
Insert into SYS.EMPLOYEE_SALARY_T (EMPLOYEE_ID,EMPLOYEE_NAME,DEPARTMENT,COMPANY,SALARY,SALARY_YEAR) values ('004','ts2','dep002','AvsSoft',6000,'2008');

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值