在 Oracle 中,我有时想创建诸如此类的构造
SELECT * FROM TABLE(STRINGS('a', 'b', 'c'))
SELECT * FROM TABLE(NUMBERS(1, 2, 3))
显然,我可以为上述声明我自己的类型。我可以选择TABLE
and 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 运行在一个未知的系统上,我无法创建类型,因为我可能没有必要的授权,该怎么办?
所以我的问题是:Oracle知道“匿名”吗TABLE
/ VARRAY
任何 Oracle 实例上都可用的类型?类似Postgres/H2/HSQLDB的简单ARRAY
types?
UPDATE:如果相关的话,我主要是从 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_TYPES 似乎是一个更好的字典视图
找到合适的类型”
那是个很好的观点。我们还可以过滤 COLL_TYPE 以筛选出 VARRAY。该视图被引入到 10g 中,而 ALL_TYPES 在 9i 上可用。与 Oracle 的大多数功能一样,版本越晚,它拥有的功能就越多。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)