【问题标题】:In Oracle, how do I verify the object type used from an object type hierarchy?在 Oracle 中,如何验证对象类型层次结构中使用的对象类型?
【发布时间】:2018-12-04 15:14:06
【问题描述】:

我在 Oracle 模式中有一个类型层次结构:

CREATE OR REPLACE TYPE FV AS OBJECT (
   idno           NUMBER)
NOT FINAL;
/

CREATE TYPE FV_Integer UNDER FV (
   features INTEGER_ARRAY)
   NOT FINAL;
/


CREATE TYPE FV_Number UNDER FV (
   features NUMBER_ARRAY)
   NOT FINAL;
/

我想构建一个 PLSQL 函数来验证哪种类型的层次结构是对象:对于函数 dummy(obj1 FV, obj2 FV)... 我如何检查用户的层次结构的对象类型是什么使用?

例如,我想打印对象类型名称(该函数用于说明,它不是真正的pl/sql代码):

 dummy(obj1 FV, obj2 FV){
      if obj1%type = FV_INTEGER
          THEN print 'FV_INTEGER'
      endif
      if obj2%type = FV_NUMBER
          THEN print 'FV_NUMBER'
      endif
}

【问题讨论】:

  • 不是很清楚你的要求是什么。但是,如果在 Object 下创建 Object,则父对象将变为 SUPERTYPE,您可以从 USER_TYPES 数据字典中获取 SUPERTYPE 名称。

标签: oracle oop plsql types oracle12c


【解决方案1】:

您可以使用sys.anydata检查对象的类型:

create or replace function which_type
    ( p_fv fv )
    return varchar2
as
begin
    return sys.anydata.gettypename(sys.anydata.convertobject(p_fv));
end which_type;

测试:

create or replace type number_array as table of number;
create or replace type integer_array as table of integer;

create or replace type fv as object (
   idno           number)
not final;
/

create type fv_integer under fv (
   features integer_array)
   not final;
/

create type fv_number under fv (
   features number_array)
   not final;
/

create table fv_test (my_fv fv);

insert into fv_test values (fv(1));
insert into fv_test values (fv_integer(1, integer_array(1)));
insert into fv_test values (fv_number(1, number_array(1)));

select which_type(my_fv) from fv_test;

WHICH_TYPE(MY_FV)
-------------------------
WILLIAM.FV
WILLIAM.FV_INTEGER
WILLIAM.FV_NUMBER

3 rows selected.

【讨论】:

    【解决方案2】:

    使用user_types字典视图创建函数:

    SQL> set serveroutput on;
    SQL> create or replace function chk_typ_obj( i_type_name user_types.type_name%type )
      2  return pls_integer is
      3    o_val pls_integer;
      4  begin
      5    for c in
      6      (
      7      select decode(t.incomplete,'NO',1,0) icomp
      8        from user_types t
      9       where t.type_name = i_type_name
     10      )
     11      loop
     12        o_val := c.icomp;
     13      end loop;
     14  
     15        return o_val;
     16  end;
     17  /
    
    Function created
    
    SQL> var o_val number;
    SQL> exec :o_val := chk_typ_obj('FV');
    
    PL/SQL procedure successfully completed
    o_val
    ---------
    1
    
    SQL> exec :o_val := chk_typ_obj('FV_NUMBER');
    
    PL/SQL procedure successfully completed
    o_val
    ---------
    0
    

    如果其中省略了AS OBJECT,则声明不完整。

    所以,如果chk_typ_obj

    • 返回 1,然后是 TYPE OBJECT

    • 返回0,则不是TYPE OBJECT

    • r 变为 null,则不存在该名称调用的此类类型

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-28
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多