运行结果为:?
Sql代码?
- 包含字母A的名字: ??
- ALLEN ??
- WARD ??
- MARTIN ??
- BLAKE ??
- CLARK ??
- ADAMS ??
- JAMES ??
- 包含字母B的名字: ??
- BLAKE ??
- 包含字母C的名字: ??
- CLARK ??
- SCOTT??
说明:使用了二重循环,在外循环体中,动态生成游标的SELECT语句,然后打开。通过语句letter:=chr(ascii(letter)+1)可获得字母表中的下一个字母。?
异常处理? 错误处理? 错误处理部分位于程序的可执行部分之后,是由WHEN语句引导的多个分支构成的。错误处理的语法如下:? EXCEPTION? WHEN 错误1[OR 错误2] THEN? 语句序列1;? WHEN 错误3[OR 错误4] THEN? 语句序列2;? WHEN OTHERS? 语句序列n;? END;? 其中:? 错误是在标准包中由系统预定义的标准错误,或是由用户在程序的说明部分自定义的错误,参见下一节系统预定义的错误类型。? 语句序列就是不同分支的错误处理部分。? 凡是出现在WHEN后面的错误都是可以捕捉到的错误,其他未被捕捉到的错误,将在WHEN OTHERS部分进行统一处理,OTHENS必须是EXCEPTION部分的最后一个错误处理分支。如要在该分支中进一步判断错误种类,可以通过使用预定义函数SQLCODE( )和SQLERRM( )来获得系统错误号和错误信息。? 如果在程序的子块中发生了错误,但子块没有错误处理部分,则错误会传递到主程序中。? 下面是由于查询编号错误而引起系统预定义异常的例子。? 【训练1】? 查询编号为1234的雇员名字。?
Sql代码?
- SET?SERVEROUTPUT?ON??
- DECLARE??
- v_name?VARCHAR2(10); ??
- BEGIN??
- ???SELECT???ename ??
- ???INTO?????v_name ??
- ???FROM?????emp ??
- ???WHERE????empno?=?1234; ??
- DBMS_OUTPUT.PUT_LINE(‘该雇员名字为:‘||?v_name); ??
- EXCEPTION ??
- ??WHEN?NO_DATA_FOUND?THEN??
- ????DBMS_OUTPUT.PUT_LINE(‘编号错误,没有找到相应雇员!‘); ??
- ??WHEN?OTHERS?THEN??
- ????DBMS_OUTPUT.PUT_LINE(‘发生其他错误!‘); ??
- END;??
执行结果为:?
Sql代码?
- 编号错误,没有找到相应雇员! ??
- ????????PL/SQL?过程已成功完成。??
说明:在以上查询中,因为编号为1234的雇员不存在,所以将发生类型为“NO_DATA_? FOUND”的异常。“NO_DATA_FOUND”是系统预定义的错误类型,EXCEPTION部分下的WHEN语句将捕捉到该异常,并执行相应代码部分。在本例中,输出用户自定义的错误信息“编号错误,没有找到相应雇员!”。如果发生其他类型的错误,将执行OTHERS条件下的代码部分,显示“发生其他错误!”。? 【训练2】? 由程序代码显示系统错误。?
Sql代码?
- SET?SERVEROUTPUT?ON??
- DECLARE??
- v_temp?NUMBER(5):=1; ??
- BEGIN??
- v_temp:=v_temp/0; ??
- EXCEPTION ??
- ??WHEN?OTHERS?THEN??
- DBMS_OUTPUT.PUT_LINE(‘发生系统错误!‘); ??
- ????DBMS_OUTPUT.PUT_LINE(‘错误代码:‘||?SQLCODE(?)); ??
- ????DBMS_OUTPUT.PUT_LINE(‘错误信息:‘?||SQLERRM(?)); ??
- ????????END;??
执行结果为:?
Sql代码?
- 发生系统错误! ??
- ????????错误代码:?1476 ??
- ????????错误信息:ORA-01476:?除数为?0 ??
- ????????PL/SQL?过程已成功完成。??
说明:程序运行中发生除零错误,由WHEN OTHERS捕捉到,执行用户自己的输出语句显示错误信息,然后正常结束。在错误处理部分使用了预定义函数SQLCODE( )和SQLERRM( )来进一步获得错误的代码和种类信息。? 预定义错误? Oracle的系统错误很多,但只有一部分常见错误在标准包中予以定义。定义的错误可以在EXCEPTION部分通过标准的错误名来进行判断,并进行异常处理。常见的系统预定义异常如下所示。?
Sql代码?
- 错?误?名?称?错误代码????错?误?含?义 ??
- CURSOR_ALREADY_OPEN?ORA_06511???试图打开已经打开的游标 ??
- INVALID_CURSOR??ORA_01001???试图使用没有打开的游标 ??
- DUP_VAL_ON_INDEX????ORA_00001???保存重复值到惟一索引约束的列中 ??
- ZERO_DIVIDE?ORA_01476???发生除数为零的除法错误 ??
- INVALID_NUMBER??ORA_01722???试图对无效字符进行数值转换 ??
- ROWTYPE_MISMATCH????ORA_06504???主变量和游标的类型不兼容 ??
- VALUE_ERROR?ORA_06502???转换、截断或算术运算发生错误 ??
- TOO_MANY_ROWS???ORA_01422???SELECT…INTO…语句返回多于一行的数据 ??
- NO_DATA_FOUND???ORA_01403???SELECT…INTO…语句没有数据返回 ??
- TIMEOUT_ON_RESOURCE?ORA_00051???等待资源时发生超时错误 ??
- TRANSACTION_BACKED_OUT??ORA_00060???由于死锁,提交失败 ??
- STORAGE_ERROR???ORA_06500???发生内存错误 ??
- PROGRAM_ERROR???ORA_06501???发生PL/SQL内部错误 ??
- NOT_LOGGED_ON???ORA_01012???试图操作未连接的数据库 ??
- LOGIN_DENIED????ORA_01017???在连接时提供了无效用户名或口令??
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|