[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.명시 적으로 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.흥미로운 솔루션은 여기에 사용자 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.귀하의 질문은 매우 일반적입니다 - 기본적으로이 같은 익명 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"같은 건 없다.
from https://stackoverflow.com/questions/8785459/anonymous-table-or-varray-type-in-oracle by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 그것은 MySQL의 저장 프로 시저에 대한 기본 매개 변수를 가질 수 있습니까? (0) | 2020.05.10 |
---|---|
[SQL] 어떻게 ALTER TABLE 문에서 'DELETE CASCADE ON'추가 (0) | 2020.05.10 |
[SQL] MySQL은 / SQL : 업데이트 된 테이블 자체에서 상관 하위 쿼리와 업데이트 (0) | 2020.05.09 |
[SQL] 영숫자는 PostgreSQL을 함께 정렬 (0) | 2020.05.09 |
[SQL] 어떻게 데이터베이스에서 값을 채우기 HTML 드롭 다운 목록에 (0) | 2020.05.09 |