Oracle의 익명 TABLE 또는 VARRAY 유형
Oracle에서 저는 가끔 이런 구조체를 만들고 싶습니다.
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
type. 만약 내 SQL이 알 수 없는 시스템에서 실행되고 있는데 필요한 권한이 없을 수도 있기 때문에 유형을 만들 수 없다면 어떻게 해야 할까요?
그래서 제 질문은: Oracle은 "익명"을 알고 있습니까?TABLE
/VARRAY
모든 Oracle 인스턴스에서 사용할 수 있는 유형Postgres / H2 / HSQLDB의 단순함과 유사함ARRAY
종류?
업데이트: 관련성이 있다면 대부분 Java에서 이 SQL을 실행하고 있습니다.PL/SQL에 대해 설명할 필요가 없습니다. 익명의 SQL 어레이 유형(즉, "익명의" 독립 실행형 저장 유형)을 찾고 있습니다.만약 그들이 전혀 존재하지 않는다면, 대답은 NO입니다.
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
/
물론, 이 결과는 데이터베이스마다 다를 것입니다.예를 들어 데이터베이스의 많은 컬렉션이 XDB에서 소유하고 있으며 모든 시스템에 해당 컬렉션이 설치되어 있지는 않습니다.이 답변의 맨 위에 나열한 네 가지는 9iR2 이후(아마도 초기) 모든 데이터베이스에서 사용할 수 있어야 합니다. 비록 이전 버전에서 항상 문서화되어 있는 것은 아닙니다.
"ALL_COLL_TYPERS는 적절한 유형을 찾기 위한 훨씬 더 나은 사전 보기인 것 같습니다."
좋은 지적입니다.또한 COLL_TYPE을 필터링하여 VARRAY를 제거할 수 있습니다.ALL_TYPERS가 9i에서 사용 가능한 반면, 이 뷰는 10g에 도입되었습니다.대부분의 Oracle과 마찬가지로 버전이 최신일수록 더 많은 기능을 제공합니다.
SQL 테이블 및 배열 유형
여기서 사용자 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;
결과(Oracle 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
내가 필요로 하는 것에 가장 잘 어울릴 겁니다.
PL/SQL 인덱싱된 어레이 유형
PL 12c 및 PL/SQL을 사용할 수도 있습니다.DBMS_SQL
유형, 이 유형은 다음을 사용하여 중첩되지 않을 수 있습니다.TABLE(..)
이 있습니다다음이 있습니다.
DBMS_SQL.CLOB_TABLE
DBMS_SQL.BINARY_FLOAT_TABLE
DBMS_SQL.BINARY_DOUBLE_TABLE
DBMS_SQL.BLOB_TABLE
DBMS_SQL.BFILE_TABLE
DBMS_SQL.DATE_TABLE
DBMS_SQL.NUMBER_TABLE
DBMS_SQL.UROWID_TABLE
DBMS_SQL.VARCHAR2_TABLE
DBMS_SQL.TIME_TABLE
DBMS_SQL.TIME_WITH_TIME_ZONE_TABLE
DBMS_SQL.TIMESTAMP_TABLE
DBMS_SQL.TIMESTAMP_WITH_LTZ_TABLE
DBMS_SQL.TIMESTAMP_WITH_TIME_ZONE_TABLE
DBMS_SQL.INTERVAL_DAY_TO_SECOND_TABLE
DBMS_SQL.INTERVAL_YEAR_TO_MONTH_TABLE
일반적입니다 - 이것들을 할 수 .VARARRAY
/TABLE
인 ) 사용합니다.CREATE TYPE
다음과 같은 익명 PL/SQL 블록:
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;
Oracle 참조는 http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/composites.htm 을 참조하십시오. 이에 따르면 다음과 같은 모든 항목이 해당됩니다.VARARRAY
및/는TABLE
합니다.DECLARE
는 는또을생됨성해통▁d를 통해 됩니다.CREATE TYPE
는 "인 AFAIK"와 같은 것이 .VARARRAY
/TABLE
".
언급URL : https://stackoverflow.com/questions/8785459/anonymous-table-or-varray-type-in-oracle
'programing' 카테고리의 다른 글
라즈베리 파이의 성능이 오픈 JDK와 오라클 JDK 사이에 그렇게 차이가 나는 이유는 무엇입니까? (0) | 2023.07.16 |
---|---|
단일 파일/디렉토리를 '기트 커밋'하는 방법 (0) | 2023.07.16 |
Javascript로 클라이언트의 MongoDB 사용 (0) | 2023.07.11 |
mongo 엔진에서 하나()를 찾고 하나()를 찾습니다. (0) | 2023.07.11 |
NppExec 플러그인을 사용하여 메모장++ 내에서 C 파일을 컴파일하고 실행하는 방법은 무엇입니까? (0) | 2023.07.11 |