解决字符串连接设置间隔符的问题

日期: 2009-05-14 作者:杨廷琨 来源:TechTarget中国 英文

  使用自定义聚集函数的方法,可以方便的设置任何的字符作为字符串的间隔符。不过如果间隔符经常的发生变化,那么每次重建自定义聚集函数,或者为每个不同的间隔符建立一个函数的方法就显得过于麻烦了。

  其实解决方法很简单,只需要额外创建一个包来设置间隔字符:


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; 

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

官方微博

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个字符,否则缓冲区会溢出。