解決字串連線設定間隔符的問題

yangtingkun發表於2009-05-11

Oracle10g提供了字串連線的功能,使用WMSYS.WM_CONCAT(TNAME)就可以實現這個功能。不過在文中也提到了,利用Oracle提供的方法只能使用逗號作為字串的分隔符。

10g新增功能實現字串連線:http://yangtingkun.itpub.net/post/468/484171

對字串的“sum”——在Oracle中自定義聚集函式的例子:http://yangtingkun.itpub.net/post/468/3380

 

 

使用自定義聚集函式的方法,可以方便的設定任何的字元作為字串的間隔符。不過如果間隔符經常的發生變化,那麼每次重建自定義聚集函式,或者為每個不同的間隔符建立一個函式的方法就顯得過於麻煩了。

其實解決方法很簡單,只需要額外建立一個包來設定間隔字元:

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_STAT|T_TEMP2|T_INDEX_ORG|T_EXTERNAL2|T_INTER|T1|T2

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-594775/,如需轉載,請註明出處,否則將追究法律責任。

相關文章