首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Oracle中,如何验证对象类型层次结构中使用的对象类型?

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

Stack Overflow用户
提问于 2018-06-26 01:29:58
回答 3查看 2.8K关注 0票数 3

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

代码语言:javascript
复制
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,obj2 FV).如何检查用户正在使用的层次结构的对象类型?

例如,我想要打印对象类型名称(函数是用于编制的,它不是一个真正的pl/sql代码):

代码语言:javascript
复制
 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
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-26 14:36:34

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

代码语言:javascript
复制
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;

测试:

代码语言:javascript
复制
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.
票数 5
EN

Stack Overflow用户

发布于 2018-06-26 03:36:15

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

代码语言:javascript
复制
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,则它的类型为OBJECT
  • 返回0,则不属于OBJECT类型
  • ,则不存在该名称调用的此类类型。
票数 0
EN

Stack Overflow用户

发布于 2022-06-20 05:36:13

基于@WilliamRobertson的回答:

我们也可以在查询中单独使用sys.anydata.gettypename(sys.anydata.convertobject(...)),而不需要定制函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51033733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档