風之力

导航

用一个实例讲解Oracle的自定义聚集函数

(网上找的,原地址不记得了,这里记载下,以后看)

 

Oracle数据库的定制功能十分强大。Oracle不但允许用户定制自己的函数,还可以定制自己的聚集函数和分析函数。 

本文将着重介绍使用自定义聚集函数建立一个字符串“sum”的示例: 

代码

SQL
> CREATE OR REPLACE TYPE T_LINK AS OBJECT (   STR VARCHAR2(30000),  
 STATIC 
FUNCTION ODCIAGGREGATEINITIALIZE  (SCTX IN OUT T_LINK) RETURN NUMBER,  
 MEMBER 
FUNCTION ODCIAGGREGATEITERATE  (SELF IN OUT T_LINK, VALUE IN VARCHAR2RETURN NUMBER,  
 MEMBER 
FUNCTION ODCIAGGREGATETERMINATE  (SELF IN T_LINK, RETURNVALUE OUT VARCHAR2, FLAGS IN NUMBERRETURN NUMBER,  
 MEMBER 
FUNCTION ODCIAGGREGATEMERGE  (SELF IN OUT T_LINK, CTX2 IN T_LINK) RETURN NUMBER  
 )  

/  

类型已创建。  

 

 

代码

SQL
> CREATE OR REPLACE TYPE BODY T_LINK IS  
 STATIC 
FUNCTION ODCIAGGREGATEINITIALIZE  (SCTX IN OUT T_LINK) RETURN NUMBER IS  
 
BEGIN  
 SCTX :
= T_LINK(NULL);  
 
RETURN ODCICONST.SUCCESS;  
 
END;    

 MEMBER 
FUNCTION ODCIAGGREGATEITERATE (SELF IN OUT T_LINK, VALUE IN VARCHAR2RETURN NUMBER IS  
 
BEGIN 
 SELF.
STR := SELF.STR || VALUE; 
 
RETURN ODCICONST.SUCCESS; 
 
END;  

 MEMBER 
FUNCTION ODCIAGGREGATETERMINATE  (SELF IN T_LINK, RETURNVALUE OUT VARCHAR2, FLAGS IN NUMBERRETURN NUMBER IS  
 
BEGIN  
 RETURNVALUE :
= SELF.STR;  
 
RETURN ODCICONST.SUCCESS;  
 
END;  
  
 MEMBER 
FUNCTION ODCIAGGREGATEMERGE  (SELF IN OUT T_LINK, CTX2 IN T_LINK) RETURN NUMBER IS  
 
BEGIN  
 
NULL;  
 
RETURN ODCICONST.SUCCESS;  
 
END;  

 
END;  

 
/  

类型主体已创建。  

 

 


SQL
> CREATE OR REPLACE FUNCTION F_LINK  (P_STR VARCHAR2RETURN VARCHAR2  AGGREGATE USING T_LINK;  

/  

函数已创建。  

 

 


SQL
> CREATE TABLE TEST (ID NUMBER, NAME VARCHAR2(20));  

表已创建。  

 

 



SQL
> INSERT INTO TEST VALUES (1'AAA');  

已创建 
1 行。  

 

 

代码

SQL
> INSERT INTO TEST VALUES (2'BBB');  

已创建 
1 行。  

SQL
> INSERT INTO TEST VALUES (1'ABC');  

已创建 
1 行。  

SQL
> INSERT INTO TEST VALUES (3'CCC');  

已创建 
1 行。  

SQL
> INSERT INTO TEST VALUES (2'DDD');  

已创建 
1 行。  

SQL
> COMMIT;  

提交完成。  

SQL
> COL NAME FORMAT A60  

SQL
> SELECT ID, F_LINK(NAME) NAME FROM TEST GROUP BY ID;  

ID NAME  

---------- ------------------------------------------------------  

1 AAAABC  

2 BBBDDD  

3 CCC  

 

 

posted on 2010-01-05 22:18  ZY.Zhou  阅读(272)  评论(0编辑  收藏  举报