oracle – IS OF TYPE生成异常
发布时间:2021-01-17 02:47:54 所属栏目:百科 来源:网络整理
导读:我读了大约 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 (type
我读了大约 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 (编辑:滁州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |