Oracle - 在sys视图中选择表类型(集合)和对象之间的关系

时间:2016-08-18 14:36:41

标签: sql oracle select types

可以从视图sys.all_types中选择oracle中的所有用户定义类型。此外,还可以从sys.all_type_attrs中选择所有类型属性。

但是,我找不到一种方法来选择或查找表类型和特定对象类型之间的关系。

例如,CREATE OR REPLACE TYPE "VARCHAR2_TT" AS TABLE OF VARCHAR2(2000)是定义的表类型。如何使用select来查找VARCHAR2_TT的类型?

我确实需要它来生成将表类型打印为varchar2的过程。

2 个答案:

答案 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;