代码之家  ›  专栏  ›  技术社区  ›  Siqueira

在Oracle中,如何验证从对象类型层次结构中使用的对象类型?

  •  1
  • Siqueira  · 技术社区  · 6 年前

    我在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函数来验证哪个层次结构类型是一个对象:对于一个函数伪(obj1 fv,obj2fv)。如何检查用户正在使用的层次结构的对象类型?

    例如,我想打印对象类型名称(函数用于ILustration,它不是真正的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
    }
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   William Robertson    6 年前

    可以使用 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
  •  0
  •   Barbaros Özhan    6 年前

    使用 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,则返回 类型对象

    • 返回0,则不属于 类型对象

    • Rtuns为空,则没有该名称调用的此类类型