2

部門ID、従業員名、入社日を含むテーブルがあります。特定の日に特定の部門に入社したすべての従業員のリストを取得したいと考えています。

wm_concat動かない。

4

6 に答える 6

2

これによると、WM_CONCATサポートされていません。

WM_CONCAT は文書化されていない関数であるため、Oracle ではユーザー アプリケーションに対してサポートされていません。

そのリンクで説明されているユーザー定義の集計関数を使用できます。

于 2013-03-15T06:05:42.720 に答える
1

試すsys.STRAGG

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

SQLフィドル

于 2013-03-15T06:06:05.433 に答える
1

wmsys.wm_concat(10g+) またはlistagg(11g+)を試してください

于 2013-03-15T06:05:36.663 に答える
1

文字列集約手法のページを参照してください。

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;

この質問の方法を試すこともできます(大きなテーブルがある場合は遅いです)

于 2013-03-15T06:35:06.457 に答える
0

まず第一に、WM_CONCATこれは文書化されていない機能であり、最新の12c バージョンから削除されているため、使用しないでください。機能に依存していたアプリケーションは、 にアップグレードすると機能しなくなります。Oracle で WM_CONCAT 関数を使用しない理由を参照してください。wm_concat12c

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.

「<strong>無効な識別子」エラーが表示されます。

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

したがって、最新バージョンでは利用できなくなった文書化されていない機能に依存しても意味がありません。

さまざまな文字列集約手法があります。

  • 11gR2 以降のLISTAGG

例えば、

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.
  • 9i 以降の ROW_NUMBER ()およびSYS_CONNECT_BY_PATH関数

例えば、

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以上のCOLLECT機能

ここにティム・ホールによるいくつかの良い例があります。

于 2016-04-10T11:16:34.430 に答える
0

ここを見てください: http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php

そのページで、Oracle 9i の ROW_NUMBER() および SYS_CONNECT_BY_PATH 関数の例を探してください。

PL/SQL がオプションの場合、TABLE_TO_COMMA プロシージャが機能する可能性があります

于 2013-03-15T12:49:44.003 に答える