2
A
回答
1
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
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
看這裏:http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php
查找該頁面上Oracle 9i中的ROW_NUMBER()和SYS_CONNECT_BY_PATH函數的示例。
如果PL/SQL是一個選項,然後TABLE_TO_COMMA程序可能工作:http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_util.htm#ARPLS73271
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.
有幾個很好的例子功能。
相關問題
- 1. 命令按鈕是否可以在Access中顯示另一個命令按鈕?
- 2. 是否有一個相當於linux命令「perf stat」的窗口?
- 3. 是否有一個命令可用於命令行參數,如sort命令對文件的操作?
- 4. 是否有一個JDBC命令來禁用表中的索引
- 5. 更新聲明適用於Oracle 9i,但不適用於Oracle 11G
- 6. 是否有用於返回上一行的Java命令?
- 7. 是否有一個相當於德爾福在C#中的「with」命令?
- 8. Netlogo:是否有一個`all-of`命令,類似於'one-of`?
- 9. 依賴於另一個命令的命令
- 10. 在另一個Mysql命令中使用一個Mysql命令的結果?
- 11. php與oracle 9i
- 12. Pl/SQL - oracle 9i
- 13. 由(ORACLE 9i)
- 14. Oracle 9i客戶機是否與Oracle 11g服務器兼容?
- 15. ODP.NET適用於9i的OracleCommandBuilder.DeriveParameters
- 16. Windows批處理 - 檢查一個命令變量是否出現在另一個命令變量中
- 17. 是否可以用另一個指令代替一個指令
- 18. bash中是否有另一個用於循環命令歷史記錄的鍵盤快捷鍵?
- 19. 在linux中是否有類似於lsof命令的perl函數?
- 20. Oracle函數:複製wm_concat
- 21. 是否有一個「更多」命令可以在Windows中的Git shell中使用?
- 22. 是否有一個通用的git「undo」命令?
- 23. 是否有一個用於將網絡資源下載到hdfs的命令?
- 24. 在用戶定義的命令中調用另一個用戶命令
- 25. 檢查參數是否爲ProcessBuilder是一個有效的命令
- 26. 檢查是否在一個ArrayList中值存在於另一個
- 27. Linux:將命令添加到bashrc中的另一個命令中
- 28. 在vim中映射命令與另一個命令
- 29. 是否有批量代碼更改爲另一個特定窗口的命令?
- 30. 如何通過使用兩個表之間的select命令在oracle 9i中更快地獲取數據
什麼版本的Oracle?你可以顯示你的查詢和*確切*錯誤信息? – Mat 2013-03-15 06:02:51
我有Oracle 9i。我還沒有想出如何在9i中做到這一點。 – user2172699 2013-03-15 06:07:59
請提供您的錯誤信息 – Sandy 2013-03-15 06:17:50