加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 站长百科 > 正文

oracle – IS OF TYPE生成异常

发布时间:2021-01-17 08:06:31 所属栏目:站长百科 来源:网络整理
导读:我读了大约 IS OF TYPE,我希望它应该返回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 TYPE,我希望它应该返回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条件下假设错误吗?

解决方法

如果您已将变量声明为O1类型,那么您可以使用[type]条件来测试您的变量是o1类型还是o1的子类型.这是一个例子(变量必须实例化):

-- base type  
 SQL> create or replace type o1 as object(
  2    prop number
  3  )not final;
  4  /

Type created

-- O1's subtype
SQL> create or replace type o2 under o1(
  2    prop1 number
  3  );
  4  /

-- test if the  l_o1 is of O1 type
SQL> declare
  2    l_o1  o1;
  3  begin
  4    l_o1 := o1(prop=>1);
  5    if l_o1 is of (o1)
  6    then
  7      dbms_output.put_line('Yes');
  8    else
  9      dbms_output.put_line('No');
 10    end if;
 11  end;
 12  /

Yes

PL/SQL procedure successfully completed

-- test if the  l_o1 is of O2 type
SQL> declare
  2    l_o1  o1;
  3  begin
  4    l_o1 := o1(prop=>1);
  5    if l_o1 is of (o2)
  6    then
  7      dbms_output.put_line('Yes');
  8    else
  9      dbms_output.put_line('No');
 10    end if;
 11  end;
 12  /

No

PL/SQL procedure successfully completed


-- test if the  l_o2 is of O2 type

SQL> declare
  2    l_o2  o2;
  3  begin
  4    l_o2 := o2(prop=>1,prop1 => 1);
  5    if l_o2 is of (o2)
  6    then
  7      dbms_output.put_line('Yes');
  8    else
  9      dbms_output.put_line('No');
 10    end if;
 11  end;
 12  /

Yes

PL/SQL procedure successfully completed

更新:

Take a look at this获取有关[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

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读