我可以让 SQL*Plus 在函数编译失败时退出并出现错误吗?

Posted

技术标签:

【中文标题】我可以让 SQL*Plus 在函数编译失败时退出并出现错误吗?【英文标题】:Can I make SQL*Plus exit with an error on function compilation failure? 【发布时间】:2013-05-07 21:44:26 【问题描述】:

我一直在研究一个将通过 SQL*Plus 以自动化方式部署的 Oracle 函数。有时我会犯错误,Oracle 会说:

警告:函数创建时出现编译错误。

然后我可以使用SHOW ERR 查看错误,但我想知道是否有一些配置我可以设置这样,在这样的编译错误:

不会创建函数 将发出基础错误 SQL*PLus 将以非 0 的退出值退出

WHENEVER SQLERROR 这样的东西会很棒。

【问题讨论】:

免费的 Oracle SQL Developer 为开发 PL/SQL 代码提供了比古老的 SQL*Plus 更好的环境。对数据库运行脚本也是如此。 可以,但不能从批处理文件中使用 【参考方案1】:

这有点令人费解,但你可以。

初始的CREATE FUNCTIONCREATE PROCEDURE 语句将创建函数或过程。您必须在脚本中检测到存在错误,并在出现错误时显式删除函数和/或过程。但是您必须在删除对象之前捕获错误。这将需要在 CREATE 语句之后的脚本中添加一些代码。

whenever sqlerror exit failure;

create or replace procedure compile_error
as
begin
  select count(*)
    into no_such_variable
    from emp;
end;
/

show error;

declare
  l_num_errors integer;
begin
  select count(*)
    into l_num_errors
    from user_errors
   where name = 'COMPILE_ERROR';

 if( l_num_errors > 0 )
 then
   execute immediate 'DROP PROCEDURE compile_error';
   raise_application_error( -20001, 'Errors in COMPILE_ERROR' );
 end if;
end;
/

执行时,此脚本将产生以下输出,其中包含错误并将删除该过程。

SQL> @c:\temp\compile_errors.sql

Warning: Procedure created with compilation errors.

Errors for PROCEDURE COMPILE_ERROR:

LINE/COL ERROR
-------- -----------------------------------------------------------------
4/3      PL/SQL: SQL Statement ignored
5/10     PLS-00201: identifier 'NO_SUCH_VARIABLE' must be declared
6/5      PL/SQL: ORA-00904: : invalid identifier
declare
*
ERROR at line 1:
ORA-20001: Errors in COMPILE_ERROR
ORA-06512: at line 12


Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

【讨论】:

人力资源部。 user_errors 对我来说是空的。啊,但它在all_errors,所以我就用它。 @theory - 如果您使用 all_errors,请确保在 OWNER 上添加谓词。 是的,这就是我正在做的。我还选择text 包含在raise_application_error() 的输出中,而不是调用SHOW ERRORS。这是为了抑制“无错误”的输出。当没有错误时。如果我能捕获SHOW ERRORS 的输出就好了……

以上是关于我可以让 SQL*Plus 在函数编译失败时退出并出现错误吗?的主要内容,如果未能解决你的问题,请参考以下文章

如果引发编译时警告,是不是可以让编译器提前退出,构建失败?

为什么退出时SQL * Plus会提交?

如何从 SQL *PLUS 中的批量插入中查找失败的插入语句

如何让 Spring Boot 应用程序在 tomcat 失败时退出

即使登录被拒绝,SQL*Plus 也会以 0 退出

如何从 PL/SQL 有条件地退出 SQL Plus