Oracle 是生成异常的类型

Oracle 是生成异常的类型,oracle,plsql,user-defined-types,Oracle,Plsql,User Defined Types,我读过,我希望它会返回TRUE、FALSE或NULL 我有两种对象类型: CREATE TYPE o1 AS OBJECT ( id NUMBER ); / CREATE TYPE o2 AS OBJECT ( id NUMBER ); / 当我运行下面的代码时,一切正常 DECLARE type1 o1; BEGIN type1 := o1(id=>1); if (type1 IS OF (o1)) then DBMS_OUTPUT.PUT_LINE(

我读过,我希望它会返回TRUE、FALSE或NULL

我有两种对象类型:

CREATE TYPE o1 AS OBJECT ( id NUMBER );
/
CREATE TYPE o2 AS OBJECT ( id NUMBER );
/
当我运行下面的代码时,一切正常

DECLARE
  type1 o1;
BEGIN
   type1 := o1(id=>1); 

   if (type1 IS OF (o1)) then
       DBMS_OUTPUT.PUT_LINE('type1 is o1');                    
   END if;  
END;
/
但当我尝试跑步时:

DECLARE
  type1 o1;
BEGIN
   type1 := o1(id=>1); 

   if (type1 IS OF (o2)) then
       DBMS_OUTPUT.PUT_LINE('type1 is o1');                    
   END if;  
END;
/
我收到了以下例外情况

Error report:
ORA-06550: line 6, column 21:
PLS-00382: expression is of wrong type
ORA-06550: line 6, column 4:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action: 

在文档中并没有明确的解释,我是否应该捕获错误类型的异常?或者,在IF条件下是否应为false?

如果您已将变量声明为
O1
类型,则可以使用
为[type]
条件来测试变量是否为
O1
类型或
O1
的子类型。下面是一个示例(必须实例化变量):

更新

获取有关
为[type]
的详细信息。通常,变量的数据类型在编译时是已知的,但如果必须处理动态类型,则可以查看
anydata
(对象数据类型)。下面是一个简单的例子:

 SQL> declare
  2    l_o1 o1;
  3  
  4    -- Here is a procedure(for the sake of simplicity has not
  5    -- been written as a schema object)
  6    -- that doesn't not know
  7    -- variable of what dada type will be passed in
  8    -- at compile time;
  9    procedure DoSomething(p_var anydata)
 10    is
 11    begin
 12      case p_var.gettypename
 13        when 'HR.O1'
 14        then dbms_output.put_line('O1 data type. Do something');
 15        when 'HR.O2'
 16        then dbms_output.put_line('O2 data type. Do something');
 17      else
 18        dbms_output.put_line('Unknown data type');
 19      end case;
 20    end;
 21  
 22  begin
 23    l_o1 := o1(prop =>  1);
 24    DoSomething(anydata.ConvertObject(l_o1));
 25  end;
 26  /

O1 data type. Do something

PL/SQL procedure successfully completed

谢谢(我知道这一点,但我想检查任何类型),对我来说很奇怪,在这种情况下,文档不是很清楚。有没有其他的选择(我知道有可能转换成任何类型,然后得到一个可以与user_types视图相比较的名称)?是的,我写过这个解决方案,但我认为有一些东西很简单。如果有人知道其他解决方案,请写信,这(半)解决我的问题。非常感谢。
 SQL> declare
  2    l_o1 o1;
  3  
  4    -- Here is a procedure(for the sake of simplicity has not
  5    -- been written as a schema object)
  6    -- that doesn't not know
  7    -- variable of what dada type will be passed in
  8    -- at compile time;
  9    procedure DoSomething(p_var anydata)
 10    is
 11    begin
 12      case p_var.gettypename
 13        when 'HR.O1'
 14        then dbms_output.put_line('O1 data type. Do something');
 15        when 'HR.O2'
 16        then dbms_output.put_line('O2 data type. Do something');
 17      else
 18        dbms_output.put_line('Unknown data type');
 19      end case;
 20    end;
 21  
 22  begin
 23    l_o1 := o1(prop =>  1);
 24    DoSomething(anydata.ConvertObject(l_o1));
 25  end;
 26  /

O1 data type. Do something

PL/SQL procedure successfully completed