2011-10-21 自定义异常的捕获
http://www.itpub.net/thread-1499223-7-1.html
70楼
下列的哪些程序块在执行之后会显示:"Trapped!"
注意:当你试图把字符串 "13-DEC-2004 6:56 PM" 使用掩码 "DD-MON-YYYY HH:MI:SS" 转换成日期型时,Oracle 会抛出 ORA-01858 错误。
(A)
DECLAREe1EXCEPTION;PRAGMAEXCEPTION_INIT(e1,-1858);BEGINDBMS_OUTPUT.put_line(TO_DATE('13-DEC-20046:56PM','DD-MON-YYYYHH:MI:SS'));EXCEPTIONWHENe1THENDBMS_OUTPUT.put_line('Trapped!');END;/
SQL>DECLARE2e1EXCEPTION;3PRAGMAEXCEPTION_INIT(e1,-1858);4BEGIN5DBMS_OUTPUT.put_line(6TO_DATE('13-DEC-20046:56PM'7,'DD-MON-YYYYHH:MI:SS'));8EXCEPTION9WHENe110THEN11DBMS_OUTPUT.put_line('Trapped!');12END;13/DECLAREe1EXCEPTION;PRAGMAEXCEPTION_INIT(e1,-1858);BEGINDBMS_OUTPUT.put_line(TO_DATE('13-DEC-20046:56PM','DD-MON-YYYYHH:MI:SS'));EXCEPTIONWHENe1THENDBMS_OUTPUT.put_line('Trapped!');END;ORA-01843:无效的月份ORA-06512:在line5SQL>
(B)
DECLAREe1EXCEPTION;PRAGMAEXCEPTION_INIT(e1,-1858);BEGINDECLAREe2EXCEPTION;PRAGMAEXCEPTION_INIT(e2,-1858);BEGINDBMS_OUTPUT.put_line(TO_DATE('13-DEC-20046:56PM','DD-MON-YYYYHH:MI:SS'));END;EXCEPTIONWHENe1THENDBMS_OUTPUT.put_line('Trapped!');END;/
SQL>DECLARE2e1EXCEPTION;3PRAGMAEXCEPTION_INIT(e1,-1858);4BEGIN5DECLARE6e2EXCEPTION;7PRAGMAEXCEPTION_INIT(e2,-1858);8BEGIN9DBMS_OUTPUT.put_line(10TO_DATE('13-DEC-20046:56PM'11,'DD-MON-YYYYHH:MI:SS'));12END;13EXCEPTION14WHENe115THEN16DBMS_OUTPUT.put_line('Trapped!');17END;18/DECLAREe1EXCEPTION;PRAGMAEXCEPTION_INIT(e1,-1858);BEGINDECLAREe2EXCEPTION;PRAGMAEXCEPTION_INIT(e2,-1858);BEGINDBMS_OUTPUT.put_line(TO_DATE('13-DEC-20046:56PM','DD-MON-YYYYHH:MI:SS'));END;EXCEPTIONWHENe1THENDBMS_OUTPUT.put_line('Trapped!');END;ORA-01843:无效的月份ORA-06512:在line9SQL>
(C)
DECLAREe1EXCEPTION;PRAGMAEXCEPTION_INIT(e1,-1858);BEGINDECLAREe2EXCEPTION;PRAGMAEXCEPTION_INIT(e2,-1858);BEGINDBMS_OUTPUT.put_line(TO_DATE('13-DEC-20046:56PM','DD-MON-YYYYHH:MI:SS'));END;EXCEPTIONWHENe2THENDBMS_OUTPUT.put_line('Trapped!');END;/
SQL>DECLARE2e1EXCEPTION;3PRAGMAEXCEPTION_INIT(e1,-1858);4BEGIN5DECLARE6e2EXCEPTION;7PRAGMAEXCEPTION_INIT(e2,-1858);8BEGIN9DBMS_OUTPUT.put_line(10TO_DATE('13-DEC-20046:56PM'11,'DD-MON-YYYYHH:MI:SS'));12END;13EXCEPTION14WHENe215THEN16DBMS_OUTPUT.put_line('Trapped!');17END;18/DECLAREe1EXCEPTION;PRAGMAEXCEPTION_INIT(e1,-1858);BEGINDECLAREe2EXCEPTION;PRAGMAEXCEPTION_INIT(e2,-1858);BEGINDBMS_OUTPUT.put_line(TO_DATE('13-DEC-20046:56PM','DD-MON-YYYYHH:MI:SS'));END;EXCEPTIONWHENe2THENDBMS_OUTPUT.put_line('Trapped!');END;ORA-06550:第14行,第9列:PLS-00201:必须声明标识符'E2'ORA-06550:第0行,第0列:PL/SQL:CompilationunitanalysisterminatedSQL>
(D)
DECLAREe1EXCEPTION;BEGINDECLAREPRAGMAEXCEPTION_INIT(e1,-1858);BEGINDBMS_OUTPUT.put_line(TO_DATE('13-DEC-20046:56PM','DD-MON-YYYYHH:MI:SS'));END;EXCEPTIONWHENe1THENDBMS_OUTPUT.put_line('Trapped!');END;/
SQL>DECLARE2e1EXCEPTION;3BEGIN4DECLARE5PRAGMAEXCEPTION_INIT(e1,-1858);6BEGIN7DBMS_OUTPUT.put_line(8TO_DATE('13-DEC-20046:56PM'9,'DD-MON-YYYYHH:MI:SS'));10END;11EXCEPTION12WHENe113THEN14DBMS_OUTPUT.put_line('Trapped!');15END;16/DECLAREe1EXCEPTION;BEGINDECLAREPRAGMAEXCEPTION_INIT(e1,-1858);BEGINDBMS_OUTPUT.put_line(TO_DATE('13-DEC-20046:56PM','DD-MON-YYYYHH:MI:SS'));END;EXCEPTIONWHENe1THENDBMS_OUTPUT.put_line('Trapped!');END;ORA-06550:第2行,第4列:PLS-00700:'E1'的PRAGMAEXCEPTION_INIT必须在同一个声明部分中的异常错误声明之后ORA-06550:第5行,第7列:PL/SQL:ItemignoredSQL>
结果有出入,设置语言为英文后重跑
SQL>altersessionsetnls_language='american';SessionalteredSQL>SQL>DECLARE2e1EXCEPTION;3PRAGMAEXCEPTION_INIT(e1,-1858);4BEGIN5DBMS_OUTPUT.put_line(6TO_DATE('13-DEC-20046:56PM'7,'DD-MON-YYYYHH:MI:SS'));8EXCEPTION9WHENe110THEN11DBMS_OUTPUT.put_line('Trapped!');12END;13/Trapped!PL/SQLproceduresuccessfullycompletedSQL>
SQL>altersessionsetnls_language='american';SessionalteredSQL>SQL>SQL>DECLARE2e1EXCEPTION;3PRAGMAEXCEPTION_INIT(e1,-1858);4BEGIN5DECLARE6e2EXCEPTION;7PRAGMAEXCEPTION_INIT(e2,-1858);8BEGIN9DBMS_OUTPUT.put_line(10TO_DATE('13-DEC-20046:56PM'11,'DD-MON-YYYYHH:MI:SS'));12END;13EXCEPTION14WHENe115THEN16DBMS_OUTPUT.put_line('Trapped!');17END;18/Trapped!PL/SQLproceduresuccessfullycompletedSQL>
SQL>altersessionsetnls_language='american';SessionalteredSQL>SQL>SQL>DECLARE2e1EXCEPTION;3PRAGMAEXCEPTION_INIT(e1,-1858);4BEGIN5DECLARE6e2EXCEPTION;7PRAGMAEXCEPTION_INIT(e2,-1858);8BEGIN9DBMS_OUTPUT.put_line(10TO_DATE('13-DEC-20046:56PM'11,'DD-MON-YYYYHH:MI:SS'));12END;13EXCEPTION14WHENe215THEN16DBMS_OUTPUT.put_line('Trapped!');17END;18/DECLAREe1EXCEPTION;PRAGMAEXCEPTION_INIT(e1,-1858);BEGINDECLAREe2EXCEPTION;PRAGMAEXCEPTION_INIT(e2,-1858);BEGINDBMS_OUTPUT.put_line(TO_DATE('13-DEC-20046:56PM','DD-MON-YYYYHH:MI:SS'));END;EXCEPTIONWHENe2THENDBMS_OUTPUT.put_line('Trapped!');END;ORA-06550:line14,column9:PLS-00201:identifier'E2'mustbedeclaredORA-06550:line0,column0:PL/SQL:CompilationunitanalysisterminatedSQL>
SQL>altersessionsetnls_language='american';SessionalteredSQL>SQL>SQL>DECLARE2e1EXCEPTION;3BEGIN4DECLARE5PRAGMAEXCEPTION_INIT(e1,-1858);6BEGIN7DBMS_OUTPUT.put_line(8TO_DATE('13-DEC-20046:56PM'9,'DD-MON-YYYYHH:MI:SS'));10END;11EXCEPTION12WHENe113THEN14DBMS_OUTPUT.put_line('Trapped!');15END;16/DECLAREe1EXCEPTION;BEGINDECLAREPRAGMAEXCEPTION_INIT(e1,-1858);BEGINDBMS_OUTPUT.put_line(TO_DATE('13-DEC-20046:56PM','DD-MON-YYYYHH:MI:SS'));END;EXCEPTIONWHENe1THENDBMS_OUTPUT.put_line('Trapped!');END;ORA-06550:line2,column4:PLS-00700:PRAGMAEXCEPTION_INITofE1mustfollowdeclarationofitsexceptioninthesamedeclarativepartORA-06550:line5,column7:PL/SQL:ItemignoredSQL>
答案AB(设置语言为英文,则答案AB;如语言为中文,答案均不正确)
答案说明74楼
A:正确捕获-1858异常B:内层也定义了-1858但是没有捕获,所以外层仍然能够捕获到C:内层的定义在外层是不可见的,会报PLS-00201:identifier'E2'mustbedeclaredD:PRAGMAEXCEPTION_INIT必须和EXCEPTION定义在同一层DECLARE中:PLS-00700:PRAGMAEXCEPTION_INITofE1mustfollowdeclarationofitsexceptioninthesamedeclarativepart
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。