2013-03-15 49 views
2

我有一個包含部門ID,員工姓名和加入日期的表格。我想要列出在給定部門的特定日期加入的所有員工。在oracle 9i中是否有另一個用於wm_concat的命令?

wm_concat不起作用。

+1

什麼版本的Oracle?你可以顯示你的查詢和*確切*錯誤信息? – Mat 2013-03-15 06:02:51

+0

我有Oracle 9i。我還沒有想出如何在9i中做到這一點。 – user2172699 2013-03-15 06:07:59

+1

請提供您的錯誤信息 – Sandy 2013-03-15 06:17:50

回答

1

嘗試wmsys.wm_concat(10克+)或listagg(11克+)

+0

我有Oracle 9i。你能爲此提出建議嗎? – user2172699 2013-03-15 06:07:23

2

根據this,不支持WM_CONCAT

WM_CONCAT is an undocumented function and as such is not supported by Oracle for user applications

您可以使用該鏈接中描述的用戶定義的聚合函數。

0

嘗試sys.STRAGG

SELECT department_id, 
     hire_date, 
     TRIM(TRAILING ',' FROM sys.STRAGG(last_name || ',')) names 
FROM employees 
GROUP BY department_id, hire_date 

SQLFiddle

1

String Aggregation Techniques頁。

對於9i中,你可以聲明UDAG功能在頁面引用:

CREATE OR REPLACE TYPE t_string_agg AS OBJECT 
(
    g_string VARCHAR2(32767), 

    STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT t_string_agg) 
    RETURN NUMBER, 

    MEMBER FUNCTION ODCIAggregateIterate(self IN OUT t_string_agg, 
             value IN  VARCHAR2) 
    RETURN NUMBER, 

    MEMBER FUNCTION ODCIAggregateTerminate(self   IN t_string_agg, 
             returnValue OUT VARCHAR2, 
             flags  IN NUMBER) 
    RETURN NUMBER, 

    MEMBER FUNCTION ODCIAggregateMerge(self IN OUT t_string_agg, 
            ctx2 IN  t_string_agg) 
    RETURN NUMBER 
); 
/



CREATE OR REPLACE TYPE BODY t_string_agg IS 
    STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT t_string_agg) 
    RETURN NUMBER IS 
    BEGIN 
    sctx := t_string_agg(NULL); 
    RETURN ODCIConst.Success; 
    END; 

    MEMBER FUNCTION ODCIAggregateIterate(self IN OUT t_string_agg, 
             value IN  VARCHAR2) 
    RETURN NUMBER IS 
    BEGIN 
    SELF.g_string := self.g_string || ',' || value; 
    RETURN ODCIConst.Success; 
    END; 

    MEMBER FUNCTION ODCIAggregateTerminate(self   IN t_string_agg, 
             returnValue OUT VARCHAR2, 
             flags  IN NUMBER) 
    RETURN NUMBER IS 
    BEGIN 
    returnValue := RTRIM(LTRIM(SELF.g_string, ','), ','); 
    RETURN ODCIConst.Success; 
    END; 

    MEMBER FUNCTION ODCIAggregateMerge(self IN OUT t_string_agg, 
            ctx2 IN  t_string_agg) 
    RETURN NUMBER IS 
    BEGIN 
    SELF.g_string := SELF.g_string || ',' || ctx2.g_string; 
    RETURN ODCIConst.Success; 
    END; 
END; 
/



CREATE OR REPLACE FUNCTION string_agg (p_input VARCHAR2) 
RETURN VARCHAR2 
PARALLEL_ENABLE AGGREGATE USING t_string_agg; 
/

而且使用它是這樣的:

SELECT deptno, string_agg(ename) AS employees 
FROM emp 
GROUP BY deptno; 

您也可以嘗試從this question方法(這是慢,如果你有大桌子)

0

首先,不使用WM_CONCAT因爲它是一個無證功能,它一直移除了最新12C版本號。任何依靠wm_concat功能的應用程序在升級到12c後都不會運行。見Why not use WM_CONCAT function in Oracle?

SQL> select banner from v$version where rownum = 1; 

BANNER 
---------------------------------------------------------------------------- 
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production 

SQL> SELECT object_name 
    2 FROM dba_objects 
    3 WHERE owner='WMSYS' 
    4 AND object_name LIKE 'WM\_%' ESCAPE '\'; 

OBJECT_NAME 
---------------------------------------------------------------------------- 
WM_REPLICATION_INFO 
WM_RDIFF 
WM_PERIOD 
WM_PERIOD 
WM_OVERLAPS 
WM_MEETS 
WM_LESSTHAN 
WM_LDIFF 
WM_INTERSECTION 
WM_INSTALLATION 
WM_GREATERTHAN 
WM_EVENTS_INFO 
WM_ERROR 
WM_ERROR 
WM_EQUALS 
WM_DDL_UTIL 
WM_DDL_UTIL 
WM_CONTAINS 
WM_COMPRESS_BATCH_SIZES 
WM_COMPRESSIBLE_TABLES 

20 rows selected. 

,您會收到一個「無效的標識符」錯誤:

SQL> SELECT banner FROM v$version; 

BANNER 
---------------------------------------------------------------------------- 
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production 
PL/SQL Release 12.1.0.1.0 - Production 
CORE 12.1.0.1.0  Production 
TNS for 64-bit Windows: Version 12.1.0.1.0 - Production 
NLSRTL Version 12.1.0.1.0 - Production 

SQL> SELECT deptno, wm_concat(ename) FROM emp; 
SELECT deptno, wm_concat(ename) FROM emp 
       * 
ERROR at line 1: 
ORA-00904: "WM_CONCAT": invalid identifier 

因此,沒有一點依靠的無證功能這是沒有更多的最新版本提供。

有各種string aggregation techniques

  • LISTAGG在11gR2中和高達

例如,

SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees 
FROM emp 
GROUP BY deptno; 

    DEPTNO EMPLOYEES 
---------- -------------------------------------------------- 
     10 CLARK,KING,MILLER 
     20 ADAMS,FORD,JONES,SCOTT,SMITH 
     30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD 

3 rows selected. 
  • ROW_NUMBER()SYS_CONNECT_BY_PATH在9i和向上

例如功能,

SELECT deptno, 
     LTRIM(MAX(SYS_CONNECT_BY_PATH(ename,',')) 
     KEEP (DENSE_RANK LAST ORDER BY curr),',') AS employees 
FROM (SELECT deptno, 
       ename, 
       ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) AS curr, 
       ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) -1 AS prev 
     FROM emp) 
GROUP BY deptno 
CONNECT BY prev = PRIOR curr AND deptno = PRIOR deptno 
START WITH curr = 1; 

    DEPTNO EMPLOYEES 
---------- -------------------------------------------------- 
     10 CLARK,KING,MILLER 
     20 ADAMS,FORD,JONES,SCOTT,SMITH 
     30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD 

3 rows selected. 
  • 用戶定義的集合函數在AskTom描述STRAGG
  • 收集10g和增長here蒂姆·霍爾

有幾個很好的例子功能。

相關問題