Oracle中的匿名TABLE或VARRAY类型

Luk*_*der 19 sql arrays oracle anonymous-types

在Oracle中,我有时会想要创建这些构造

SELECT * FROM TABLE(STRINGS('a', 'b', 'c'))
SELECT * FROM TABLE(NUMBERS(1, 2, 3))
Run Code Online (Sandbox Code Playgroud)

显然,我可以为上述声明我自己的类型.我可以选择TABLEVARRAY.例如:

CREATE TYPE STRINGS AS TABLE OF VARCHAR2(100);
CREATE TYPE NUMBERS AS VARRAY(100) OF NUMBER(10);
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,另一种解决方案是编写类似的东西

SELECT 'a' FROM DUAL UNION ALL
SELECT 'b' FROM DUAL UNION ALL
SELECT 'c' FROM DUAL
Run Code Online (Sandbox Code Playgroud)

但是我可能有更复杂的例子,我真的需要一个TABLE/ VARRAYtype.那么如果我的SQL运行在一个我无法创建类型的未知系统上,因为我可能没有必要的资助呢?

所以我的问题是: Oracle是否知道任何Oracle实例上可用的"匿名" TABLE/ VARRAY类型?类似于Postgres/H2/HSQLDB的简单ARRAY类型?

更新:如果这是相关的,我主要是从Java运行这个SQL.不需要向我解释PL/SQL,我只是在寻找匿名的SQL数组类型(即"匿名" 独立存储类型).如果它们根本不存在,答案是否定的

APC*_*APC 19

如果您不害怕明确引用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> 
Run Code Online (Sandbox Code Playgroud)

但是,如果这些不足以满足您的需求,请运行此查询以查找更多内容:

select type_name
       , owner
from all_types
where typecode = 'COLLECTION'
and owner != user
/
Run Code Online (Sandbox Code Playgroud)

当然,这个结果因数据库而异.例如,我的数据库中的很多colllections都归XDB所有,并不是每个系统都安装了.从9iR2(可能是早期版本)开始,每个数据库都应该提供我在本答案顶部列出的四个,尽管它们并不总是在早期版本中记录.


"请注意,ALL_COLL_TYPES似乎是一个更好的字典视图,可以找到合适的类型"

那是个很好的观点.我们还可以过滤COLL_TYPE以赢取VARRAY.该视图被引入10g,而ALL_TYPES可用于9i.与大多数Oracle一样,版本越晚,它的功能就越多.


Luk*_*der 15

SQL表和varray类型

用户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;
Run Code Online (Sandbox Code Playgroud)

导致(在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|
+-------------+--------------+----------------------+------+-----------+
Run Code Online (Sandbox Code Playgroud)

看起来好像ORA_MINING_NUMBER_NTORA_MINING_VARCHAR2_NT将是我需要的最佳匹配.

PL/SQL索引数组类型

如果使用Oracle 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