可以从视图sys.all_types中选择oracle中的所有用户定义类型。此外,还可以从sys.all_type_attrs中选择所有类型属性。
但是,我找不到一种方法来选择或查找表类型和特定对象类型之间的关系。
例如,CREATE OR REPLACE TYPE "VARCHAR2_TT" AS TABLE OF VARCHAR2(2000)
是定义的表类型。如何使用select来查找VARCHAR2_TT
的类型?
我确实需要它来生成将表类型打印为varchar2的过程。
答案 0 :(得分:2)
一旦你知道它是一个集合(all_types
告诉你),你可以查看the all_coll_types
view:
ALL_COLL_TYPES描述当前用户可访问的所有命名集合类型(变量和嵌套表)。
在这种情况下,您会看到,选择几列:
select coll_type, elem_type_name, length from all_coll_types where type_name = 'VARCHAR2_TT';
COLL_TYPE ELEM_TYPE_NAME LENGTH
------------------------------ ------------------------------ ----------
TABLE VARCHAR2 2000
对于其他类型的集合,其他一些列将是相关的。
如果您有一组对象,则会看到对象类型;这里作为varray而不是嵌套表,只是为了显示上限也是可用的:
create or replace type my_obj_t as object(id number);
/
create or replace type my_obj_tt as varray(5) of my_obj_t;
/
select coll_type, upper_bound, elem_type_name, length from all_coll_types where type_name = 'MY_OBJ_TT';
COLL_TYPE UPPER_BOUND ELEM_TYPE_NAME LENGTH
------------------------------ ----------- ------------------------------ ----------
VARYING ARRAY 5 MY_OBJ_T
......等等。
您还可以使用select dbms_metadata.get_ddl('TYPE', 'VARCHAR2_TT') from dual
重新创建类型的DDL,但这似乎不是您想要的。
答案 1 :(得分:0)
以下是在当前用户的架构中将所有“表类型”显示为“varchar2”的过程。当然,您可以将这些用户表替换为ALL或DBA以获得更广泛的前景。
Create or replace procedure display_type
as
cursor type_usrr is
select UT.type_name typname
from user_types UT,
user_COLL_TYPES UCT
where UT.type_name = UCT.type_name
and UT.typecode = 'COLLECTION'
and UCT.COLL_TYPE = 'TABLE'
and UCT.ELEM_TYPE_NAME = 'VARCHAR2' ;
Begin
for recs in type_usrr
loop
dbms_output.put_line(recs.typname);
end loop;
end;