使用SQLP*PLUS时,如果执行SQL*PLUS的特定命令,只要没有错误,就认为是执行正常;相反地,如果执行SQL或者PL/SQL命令,如果返回了正确的文本,则执行正常。当SQL*PLUS执行碰到错误时,默认地,它会报错并继续执行。当人工在交互式地执行命令时,这个特性是非常好的,但是在脚本中执行时,更希望在碰到错误的时候SQLPLUS能够退出并报错。

SQLPLUS执行中的报错分为两种,一种是系统层面的报错,比如spool命令因为文件无法创建而失败时,所报的SP2-0606: Cannot create SPOOL file就是属于系统层面的报错,如果希望定制SQL*PLUS面对这种错误的处理方法,可以使用WHENEVER OSERROR这个命令,该命令的语法如下:

Sql代码
  1. WHENEVER OSERROR {EXIT [SUCCESS|FAILURE|n|variable|:BindVariable]
  2. [COMMIT|ROLLBACK] | CONTINUE [COMMIT|ROLLBACK|NONE]}
WHENEVER OSERROR {EXIT [SUCCESS|FAILURE|n|variable|:BindVariable]                   [COMMIT|ROLLBACK] | CONTINUE [COMMIT|ROLLBACK|NONE]} 比如在SQL*PLUS中执行以下的一些命令:  
Sql代码
  1. SQL> WHENEVER OSERROR EXIT FAILURE
  2. SQL> SPOOL /root/test
  3. SP2-0606: Cannot create SPOOL file "/root/test.lst"
  4. O/S Message: No such file or directory
  5. Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
  6. With the Partitioning, OLAP, Data Mining and Real Application Testing options
  7. $ echo $?
  8. 1
SQL> WHENEVER OSERROR EXIT FAILURESQL> SPOOL /root/testSP2-0606: Cannot create SPOOL file "/root/test.lst"O/S Message: No such file or directoryDisconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing options$ echo $?1 另一种是SQL或者PL/SQL执行出错,类似地,可以使用WHENEVER SQLERROR定制SQL*PLUS的行为,该命令的语法如下,具体的例子就不重复了。
另一种是SQL或者PL/SQL执行出错,类似地,可以使用WHENEVER SQLERROR定制SQL*PLUS的行为,该命令的语法如下,具体的例子就不重复了。
 
Sql代码
  1. WHENEVER SQLERROR {EXIT [SUCCESS|FAILURE|WARNING|n|variable|:BindVariable]
  2. [COMMIT|ROLLBACK] | CONTINUE [COMMIT|ROLLBACK|NONE]}