【问题标题】:Oracle - Select in sys views relation between table type (collection) and objectOracle - 在系统视图中选择表类型(集合)和对象之间的关系
【发布时间】:2016-12-25 13:14:00
【问题描述】:

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

我仍然找不到选择或查找表类型和特定对象类型之间关系的方法。

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

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

【问题讨论】:

    标签: sql oracle select types


    【解决方案1】:

    一旦您知道这是一个集合(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
    

    对于其他类型的集合,其他一些列将是相关的。

    如果你有一个对象集合,你会看到对象类型;这里作为一个可变数组而不是一个嵌套表,只是为了显示上限也是可用的:

    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                                 
    

    ...等等。

    您也可以让 DDL 使用 select dbms_metadata.get_ddl('TYPE', 'VARCHAR2_TT') from dual 重新创建类型,但这似乎不是您想要的。

    【讨论】:

    • 当前用户的架构不应该是 USER_COLL_TYPES 而不是 ALL_COLL_TYPE。
    • 这个问题指的是all_types,所以我坚持了下来。但是,是的,如果您只在一个模式中工作,user_coll_types 就可以了。
    • 我也包含了一个带有 UDT 的示例; OP 的表类型 is 是一个 UDT,但我假设您的意思是其他 UDT 的表,我已经将其作为一个非常简单的对象(OP 也称为“表类型和特定对象之间的关系类型”)。
    • 谢谢,这正是我需要的!我将只添加 all_type_attrs,以获取对象的所有属性。
    • 也许你也可以告诉我,如果可能的话,我可以在哪个表中找到包内定义的类型?
    【解决方案2】:

    以下是在当前用户的模式中将所有“表类型”显示为“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;
    

    【讨论】:

    • 问题是如何找到给定集合的元素类型;这是相反的,从已知类型开始并查找所有匹配的集合类型。为什么要为此使用过程,而不是直接运行游标查询?连接也有点无意义,你可以自己查询user_coll_types
    • 问题有 2 个部分。首先如何找到元素类型。你回答得很好。第二次创建相同的程序。检查最后一行。”我确实需要它来生成将表类型打印为 varchar2 的程序”
    • 嗯,我认为将任何表的类型打印为字符串,而不是限制为 varchar2(n) 的表,因为剩下的问题是关于对象的。不过还不清楚……
    • 感谢您的回答!第一个答案更接近我的需要,但对我来说最重要的是找出表类型和类型之间的关系。
    猜你喜欢
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 2011-06-30
    相关资源
    最近更新 更多