복붙노트

[SQL] 오라클에서 익명 테이블이나 VARRAY 유형

SQL

오라클에서 익명 테이블이나 VARRAY 유형

오라클, 나는 때때로 이러한 것과 같은 구조를 만들고 싶습니다

SELECT * FROM TABLE(STRINGS('a', 'b', 'c'))
SELECT * FROM TABLE(NUMBERS(1, 2, 3))

물론, 위 내 자신의 유형을 선언 할 수 있습니다. 나는 TABLE과 VARRAY를 선택할 수 있습니다. 예를 들면 :

CREATE TYPE STRINGS AS TABLE OF VARCHAR2(100);
CREATE TYPE NUMBERS AS VARRAY(100) OF NUMBER(10);

이 특정한 경우에, 다른 솔루션과 같은 쓰기 것들입니다

SELECT 'a' FROM DUAL UNION ALL
SELECT 'b' FROM DUAL UNION ALL
SELECT 'c' FROM DUAL

하지만 내가 정말 TABLE / VARRAY 유형이 필요합니다 더 복잡한 예를 가질 수있다. 만약에 그래서 내 SQL 내가 필요한 보조금이 없을 수 있기 때문에이 유형을 만들 수 없습니다 알 수없는 시스템에서 실행?

합니까 오라클은 오라클 인스턴스에서 사용할 수있는 "익명"표 / VARRAY 유형을 알고 내 질문은 그래서? 포스트 그레스 / H2 / HSQLDB의 간단한 배열 유형과 유사?

업데이트 :이 관련이 있다면 대부분, 자바에서이 SQL을 실행하고 있습니다. 나에게 PL / SQL을 설명 할 필요가, 나는 정말 익명 SQL 배열 유형을 찾고하지있어 (즉, "익명"독립 저장 유형). 그들은 모두 존재하지 않는 경우, 대답은 NO입니다

해결법

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

    1.명시 적으로 SYS 스키마를 참조 무서워하지 않는 제공하는 몇 가지가있다. 여기에 몇 가지 내가 자주 사용된다 (이 메모리를 많이 씹 던데로 잘 odcivarchar2list 순전히 : 문자열 내가 dbms_debug_vc2coll를 선호).

    명시 적으로 SYS 스키마를 참조 무서워하지 않는 제공하는 몇 가지가있다. 여기에 몇 가지 내가 자주 사용된다 (이 메모리를 많이 씹 던데로 잘 odcivarchar2list 순전히 : 문자열 내가 dbms_debug_vc2coll를 선호).

    SQL> desc sys.odcinumberlist
     sys.odcinumberlist VARRAY(32767) OF NUMBER
    
    SQL> desc sys.odcivarchar2list
     sys.odcivarchar2list VARRAY(32767) OF VARCHAR2(4000)
    
    SQL> desc sys.ODCIDATELIST
     sys.ODCIDATELIST VARRAY(32767) OF DATE
    
    SQL> desc sys.dbms_debug_vc2coll
     sys.dbms_debug_vc2coll TABLE OF VARCHAR2(1000)
    
    SQL> 
    

    그러나, 귀하의 요구에 좀 더를 찾기 위해이 쿼리를 실행하기위한 사람들이 충분하지 않은 경우 :

    select type_name
           , owner
    from all_types
    where typecode = 'COLLECTION'
    and owner != user
    /
    

    물론,이 결과는 데이터베이스마다 다를 수 있습니다. 예를 들어 내 데이터베이스에 colllections의 많은 XDB가 소유가 아닌 모든 시스템이 설치되어 있다는 것입니다. 그들은 항상 이전 버전에서 설명하지 않은 있지만,이 답변의 맨 위에 나열된 4 개 개의 I는 9iR2 이후 (아마도 초기) 모든 데이터베이스에 사용할 수 있습니다.

    그건 좋은 지적이야. 우리는 또한 COLL_TYPE에 필터는 VARRAYs을 키질 할 수 있습니다. ALL_TYPES은 9i에 볼 수 있었다 반면 그보기는 10g에 도입되었다. 대부분의 것들 오라클, 최신 버전이 가지고있는 더 많은 기능과 마찬가지로.

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

    2.흥미로운 솔루션은 여기에 사용자 APC에 의해 주어졌다. 이 질문의 미래 리더를 들어,이 쿼리는 내가 정말 관심이 무엇을 제공 보는 것도 흥미로울 수 있습니다 :

    흥미로운 솔루션은 여기에 사용자 APC에 의해 주어졌다. 이 질문의 미래 리더를 들어,이 쿼리는 내가 정말 관심이 무엇을 제공 보는 것도 흥미로울 수 있습니다 :

    select coll_type, elem_type_name, type_name, length, upper_bound
    from all_coll_types
    where owner = 'SYS'
    and elem_type_name IN ('VARCHAR2', 'NUMBER')
    order by coll_type, elem_type_name, type_name;
    

    (오라클 11g의) 결과 :

    +-------------+--------------+----------------------+------+-----------+
    |COLL_TYPE    |ELEM_TYPE_NAME|TYPE_NAME             |LENGTH|UPPER_BOUND|
    +-------------+--------------+----------------------+------+-----------+
    |TABLE        |NUMBER        |KU$_OBJNUMSET         |{null}|     {null}|
    |TABLE        |NUMBER        |KU$_XMLCOLSET_T       |{null}|     {null}|
    |TABLE        |NUMBER        |ORA_MINING_NUMBER_NT  |{null}|     {null}|
    |TABLE        |VARCHAR2      |DBMS_AW$_COLUMNLIST_T |   100|     {null}|
    |TABLE        |VARCHAR2      |DBMS_DEBUG_VC2COLL    |  1000|     {null}|
    |TABLE        |VARCHAR2      |HSBLKNAMLST           |    30|     {null}|
    |TABLE        |VARCHAR2      |KU$_VCNT              |  4000|     {null}|
    |TABLE        |VARCHAR2      |ORA_MINING_VARCHAR2_NT|  4000|     {null}|
    |VARYING ARRAY|NUMBER        |AWRRPT_NUM_ARY        |{null}|         30|
    |VARYING ARRAY|NUMBER        |JDM_NUM_VALS          |{null}|        999|
    |VARYING ARRAY|NUMBER        |ODCIGRANULELIST       |{null}|      65535|
    |VARYING ARRAY|NUMBER        |ODCINUMBERLIST        |{null}|      32767|
    |VARYING ARRAY|NUMBER        |SQL_OBJECTS           |{null}|       2000|
    |VARYING ARRAY|NUMBER        |TABLESPACE_LIST       |{null}|      64000|
    |VARYING ARRAY|VARCHAR2      |AQ$_JMS_NAMEARRAY     |   200|       1024|
    |VARYING ARRAY|VARCHAR2      |AQ$_MIDARRAY          |    32|       1024|
    |VARYING ARRAY|VARCHAR2      |AWRRPT_VCH_ARY        |    80|         30|
    |VARYING ARRAY|VARCHAR2      |DBMSOUTPUT_LINESARRAY | 32767| 2147483647|
    |VARYING ARRAY|VARCHAR2      |DBMS_XS_ROLELIST      |  1024|       4096|
    |VARYING ARRAY|VARCHAR2      |FLASHBACKTBLIST       |    30|        100|
    |VARYING ARRAY|VARCHAR2      |HSBLKVALARY           |  4000|        250|
    |VARYING ARRAY|VARCHAR2      |JDM_ATTR_NAMES        |    60|        999|
    |VARYING ARRAY|VARCHAR2      |JDM_STR_VALS          |  4000|        999|
    |VARYING ARRAY|VARCHAR2      |KU$_DROPCOLLIST       |  4000|       1000|
    |VARYING ARRAY|VARCHAR2      |KUPC$_LOBPIECES       |  4000|       4000|
    |VARYING ARRAY|VARCHAR2      |ODCIRIDLIST           |  5072|      32767|
    |VARYING ARRAY|VARCHAR2      |ODCIVARCHAR2LIST      |  4000|      32767|
    |VARYING ARRAY|VARCHAR2      |RE$NAME_ARRAY         |    30|       1024|
    |VARYING ARRAY|VARCHAR2      |RE$RULE_LIST          |    65|       1024|
    |VARYING ARRAY|VARCHAR2      |SQLPROF_ATTR          |   500|       2000|
    |VARYING ARRAY|VARCHAR2      |TXNAME_ARRAY          |   256|        100|
    +-------------+--------------+----------------------+------+-----------+
    

    그것은 ORA_MINING_NUMBER_NT 및 ORA_MINING_VARCHAR2_NT이 내 요구에 가장 적합한 것처럼 보인다.

    오라클 12C 및 PL / SQL을 사용하는 경우, 또한 표 (..) 생성자를 사용 벗어난다 할 수있는 DBMS_SQL 유형 중 하나를 사용할 수있는 가능성이있다. 있다 :

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

    3.귀하의 질문은 매우 일반적입니다 - 기본적으로이 같은 익명 PL / SQL 블록에서 명시 적으로 CREATE TYPE없이이 (VARARRAY / TABLE)를 사용할 수 있습니다 :

    귀하의 질문은 매우 일반적입니다 - 기본적으로이 같은 익명 PL / SQL 블록에서 명시 적으로 CREATE TYPE없이이 (VARARRAY / TABLE)를 사용할 수 있습니다 :

    DECLARE
        TYPE genres IS VARRAY(4) OF book_genre.genre_name%TYPE;
        Fiction_genres genres;
        TYPE phone_no_tab IS VARRAY(6) OF VARCHAR2(20) ;
        phone_nos phone_no_tab;
    BEGIN
        fiction_genres := genres('MYSTERY','SUSPENSE', 'ROMANCE','HORROR');
        phone_nos := phone_no_tab();
        phone_nos.EXTEND(2);
        phone_nos(1) := '0117 942 2508';
    END;
    

    또는 같은

    declare
    
      TYPE auftrag_table_typ IS TABLE OF auftrag%ROWTYPE
              INDEX BY BINARY_INTEGER;
    
      auftrag_table auftrag_table_typ;
    
      v_index BINARY_INTEGER;
    
    begin
    
      v_index := auftrag_table.first;
    
      while v_index is not NULL loop
    
        // do something with auftrag_table(v_index)
    
        v_index := auftrag_table.next (v_index);
    
      end loop;
    
    end; 
    

    오라클 참고 http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/composites.htm 볼 - 선언되거나 TYPE을 만들 통해 생성되는 그러한 VARARRAY 및 / 또는 TABLE이 요구에 따라, AFAIK 있도록 "익명 VARARRAY / TABLE"같은 건 없다.

  4. from https://stackoverflow.com/questions/8785459/anonymous-table-or-varray-type-in-oracle by cc-by-sa and MIT license