5

私はこのクエリを持っています:

(SELECT OBJECT_ID from cr_object_group_entries_vw where object_group_id IN
    (SELECT ITEM FROM TABLE(CR_FN_SPLIT_STRING('28,56',','))))

それが返す:

ここに画像の説明を入力

しかし、私がするとき:

SELECT wm_concat(object_id) FROM
    (SELECT OBJECT_ID from cr_object_group_entries_vw where object_group_id IN
        (SELECT ITEM FROM TABLE(CR_FN_SPLIT_STRING('28,56',','))))

空白の結果が表示されます...何が間違っていますか?

4

4 に答える 4

8

wm_concat関数は文書化されておらず、Oracle 8i の時点で回避策として発見されているため、回避する必要があります。

ここでTom Kyteによって発見されたカスタム集計関数を使用した古い方法の時代以来、いくつかの新しい回避策があり、以下の例に示されています。

それらはすべてこの SQL Fiddleで再現されました。

回避策 1 - LISTAGG 関数、11g で動作:

select listagg(object_id,',') within group (order by rownum) id_string
from cr_object_group_entries_vw

回避策 2 - SYS_CONNECT_BY_PATH、10g 以降で動作:

select id_string from (
  select rn, substr(sys_connect_by_path(object_id, ','),2) id_string
  from (select object_id, rownum rn from cr_object_group_entries_vw)
  start with rn = 1
  connect by prior rn + 1 = rn
  order by rn desc
)
where rownum = 1

回避策 3 - XMLAGG、10g 以降で動作:

select replace(
         replace(
           replace(
             xmlagg(xmlelement("x",object_id)).getStringVal(),
             '</x><x>',
             ','
           ),
           '<x>',
           ''
         ),
         '</x>',
         ''
       ) id_string
from cr_object_group_entries_vw

sys_connect_by_pathPSどのOracleバージョンで導入されたか正確にはわかりませんでしxmlaggたが、どちらも10.2.0.4.0でうまく機能します

于 2013-05-21T17:25:08.633 に答える
3

この投稿を見て、wm_concatいくつかの情報を共有しようと思いました。

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

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

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

代替ソリューションについては、 Oracle String Aggregation Techniquesを参照してください。

于 2015-02-27T05:26:03.353 に答える