복붙노트

[SQL] 왜 wm_concat 여기에 작동하지 않는 이유는 무엇입니까?

SQL

왜 wm_concat 여기에 작동하지 않는 이유는 무엇입니까?

나는이 쿼리를 가지고 :

(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',','))))

나는 빈 결과를 얻을 ... 무슨 내가 잘못 뭐하는 거지?

해결법

  1. ==============================

    1.이 문서화 및 Oracle 8i를 시간에 해결 방법으로 발견되기 때문에 기능 wm_concat하지 않도록해야합니다.

    이 문서화 및 Oracle 8i를 시간에 해결 방법으로 발견되기 때문에 기능 wm_concat하지 않도록해야합니다.

    톰 카이트에 의해 발견로 사용자 정의 집계 함수 오래된 방법의 배 때문에 여기에 아래의 예에서 보여 새로운 해결 방법이있다.

    그들 모두는이 SQL 바이올린 재현.

    해결 방법 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_path 및 XMLAGG 도입했지만, 모두 10.2.0.4.0에 잘 작동

  2. ==============================

    2.경우에 당신은 스타터 11g의 시도의 LISTAGG 대신 wm_concat에있어.

    경우에 당신은 스타터 11g의 시도의 LISTAGG 대신 wm_concat에있어.

  3. ==============================

    3.난 그냥 wm_concat에 대한이 게시물을보고 몇 가지 정보를 공유하고 생각했다.

    난 그냥 wm_concat에 대한이 게시물을보고 몇 가지 정보를 공유하고 생각했다.

    wm_concat 기능에 의존하고 있었다 모든 응용 프로그램은 한 번 12C로 업그레이드 작동하지 않습니다. , 이후로는 최신 12C 버전에서 제거되었습니다. 오라클에 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.
    

    "잘못된 식별자"오류가 발생합니다 :

    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
    

    따라서, 더 이상 최신 버전에서 사용할 수 있습니다 문서화되지 않은 기능에 의존 아무 소용이 없다.

    다른 솔루션의 경우, 오라클 문자열 집계 기법을 참조하시기 바랍니다

  4. ==============================

    4.당신은 아무것도 잘못된 일을 할 나타나지 않습니다. 당신이 보여 데이터를 반환하기 위해 더미 테이블 기능으로, wm_concat은 나를 위해 일한 :

    당신은 아무것도 잘못된 일을 할 나타나지 않습니다. 당신이 보여 데이터를 반환하기 위해 더미 테이블 기능으로, wm_concat은 나를 위해 일한 :

    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',','))))
    /
    
    WM_CONCAT(OBJECT_ID)                                                           
    --------------------------------------------------------------------------------
    36,1,11,121,13,14,17,18,2,24,3,32,33,34,35,36,37,38,39,40,42,43,44,6,7,8,81      
    

    당신은 [11g] 같은 질문에 태그를 추가 한; 이 11gR2에서만 사용할 수 있지만 당신은 당신이 지원되지 않는 wm_concat 통해 지원 lisgagg를 사용해야 할 경우 @beherenow이 말한대로 나는 생각한다

    select listagg(object_id, ',') within group (order by object_id)
    from cr_object_group_entries_vw
    where object_group_id in
        (select item from table(cr_fn_split_string('28,56',',')))
    /
    
    LISTAGG(OBJECT_ID,',')WITHINGROUP(ORDERBYOBJECT_ID)
    ---------------------------------------------------------------------------
    1,11,121,13,14,17,18,2,24,3,32,33,34,35,36,36,37,38,39,40,42,43,44,6,7,8,81
    

    SQL 바이올린 (- 어쩌면 인스턴스 중 하나를하지 않습니다, 그러나 그것은 오류해야 listagg 만, 그것은 wm_concat 지원하지 않기 때문에?)

  5. from https://stackoverflow.com/questions/16674927/why-does-the-wm-concat-not-work-here by cc-by-sa and MIT license