您不能退出脚本并停留在 SQL*Plus 中,但可以停止执行。它并不漂亮,但是假设您可以修改脚本以添加控制流,那么您可以使用绑定变量来执行此操作。
set serveroutput on
var flag char;
exec :flag := 'Y';
begin
if :flag != 'Y' then
raise program_error;
end if;
dbms_output.put_line('Doing some work');
/* Check for some error condition */
if 0 != 1 then
raise program_error;
end if;
/* Only reach this if earlier statements didn't fail
* but could wrap in another flag check if needed */
dbms_output.put_line('Doing some more work');
exception
when program_error then
dbms_output.put_line(sqlerrm);
:flag := 'N';
when others then
/* Real exception handling, obviously */
dbms_output.put_line(sqlerrm);
:flag := 'N';
end;
/
-- DML only does anything if flag stayed Y
select sysdate from dual
where :flag = 'Y';
-- Optional status message at the end of the script, for DBA info
set feedback off
set head off
select 'Something went wrong' from dual where :flag != 'Y';
set feedback on
set head on
执行时:
SQL> @script
PL/SQL procedure successfully completed.
Doing some work
ORA-06501: PL/SQL: program error
PL/SQL procedure successfully completed.
no rows selected
Something went wrong
SQL>
脚本中的任何 PL/SQL 块都可以在开始时检查标志状态,并引发program_error
(就像一个方便的预定义异常)以跳回。PL/SQL 块中的任何错误都可以直接或在异常处理程序中更新绑定变量标志。并且任何非 PL/SQL DML 都可以有一个附加where
子句来检查标志状态,因此如果在N
到达该语句时已将其设置为,则不会进行任何工作。(insert
我猜这意味着不使用values
表格)。
这不能做的是处理来自普通 SQL 语句的任何错误,但我不确定这是否是一个问题。如果是,那么可能需要将这些更改为 PL/SQL 块内的动态 SQL。