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)
显然,我可以为上述声明我自己的类型.我可以选择TABLE
和VARRAY
.例如:
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
/ VARRAY
type.那么如果我的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
用户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_NT
和ORA_MINING_VARCHAR2_NT
将是我需要的最佳匹配.
如果使用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