使用自定义聚集函数的方法,可以方便的设置任何的字符作为字符串的间隔符。不过如果间隔符经常的发生变化,那么每次重建自定义聚集函数,或者为每个不同的间隔符建立一个函数的方法就显得过于麻烦了。
其实解决方法很简单,只需要额外创建一个包来设置间隔字符:
SQL> CREATE OR REPLACE PACKAGE P_LINK AS 2 V_SEP VARCHAR2(1) DEFAULT ‘,’; 3 END; 4 / |
程序包已创建。
SQL> CREATE OR REPLACE TYPE T_LINK AS OBJECT ( 2 STR VARCHAR2(32767), 3 STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT T_LINK) RETURN NUMBER, 4 MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT T_LINK, VALUE IN VARCHAR2) RETURN NUMBER, 5 MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN T_LINK, RETURNVALUE OUT VARCHAR2, FLAGS IN NUMBER) RETURN NUMBER, 6 MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT T_LINK, CTX2 IN T_LINK) RETURN NUMBER 7 ) 8 / |
类型已创建。
SQL> CREATE OR REPLACE TYPE BODY T_LINK IS 2 STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT T_LINK) RETURN NUMBER IS 3 BEGIN 4 SCTX := T_LINK(NULL); 5 RETURN ODCICONST.SUCCESS; 6 END; 7 8 MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT T_LINK, VALUE IN VARCHAR2) RETURN NUMBER IS 9 BEGIN 10 SELF.STR := SELF.STR || VALUE || P_LINK.V_SEP; 11 RETURN ODCICONST.SUCCESS; 12 END; 13 14 MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN T_LINK, RETURNVALUE OUT VARCHAR2, FLAGS IN NUMBER) RETURN NUMBER IS 15 BEGIN 16 RETURNVALUE := SUBSTR(SELF.STR, 1, LENGTH(SELF.STR) – 1); 17 RETURN ODCICONST.SUCCESS; 18 END; 19 20 MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT T_LINK, CTX2 IN T_LINK) RETURN NUMBER IS 21 BEGIN 22 NULL; 23 RETURN ODCICONST.SUCCESS; 24 END; 25 END; 26 / |
类型主体已创建。
SQL> CREATE OR REPLACE FUNCTION F_LINK(P_STR VARCHAR2) RETURN VARCHAR2 2 AGGREGATE USING T_LINK; 3 / |
函数已创建。
默认情况下,分隔符为逗号,如果需要设置其他字符为分隔符,只需要对PACKAGE中的变量赋值即可:
SQL> SELECT F_LINK(TNAME) FROM TAB; F_LINK(TNAME) ——————————————————————————————- CHAINED_ROWS,T_EXTERNAL,T_SESSION_STAT,T_TEMP2,T_INDEX_ORG,T_EXTERNAL2,T_INTER,T1,T2 SQL> EXEC P_LINK.V_SEP := ‘|’ |
PL/SQL过程已成功完成。
SQL> SELECT F_LINK(TNAME) FROM TAB; F_LINK(TNAME) ——————————————————————————————- CHAINED_ROWS|T_EXTERNAL|T_SESSION |
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
Oracle 11g:PL/SQL基础(上)
怎样定义Oracle PL/SQL?如何定义Oracle PL/SQL代码块结构?PL/SQL是基于结构化编程,静态数据类型,模块化,异常管理等建模概念设计的语言……
-
怎样在PL/SQL中将行联结到单个CLOB
我怎么合并多个varchar2行到一个CLOB类型的列?例如:创建表A (keys number, text CLOB);创建表B……
-
Oracle11g: PL/SQL基础
PL/SQL是由构造程序、统计数据、模块性以及异常管理等建模观念发展而来的。它扩展了ADA程序语言。ADA扩展了Pascal程序语言,包括配置、比较运算符以及单引字符串分隔符。
-
Oracle数据库PL/SQL过程调试的输出方法
随便在什么地方,只要是BEGIN和END之间,就可以使用DBMS_OUTPUT.PUT_LINE(output); 而这有个问题,就是使用该函数最多只可以显示255个字符,否则缓冲区会溢出。