gpt4 book ai didi

oracle - 当 PL/SQL 编译失败时如何让 SQL*Plus 退出

转载 作者:行者123 更新时间:2023-12-02 08:21:36 24 4
gpt4 key购买 nike

我的脚本文件有以下代码:

WHENEVER SQLERROR EXIT SQL.SQLCODE

@pkg_t.pks
@pkg_t.pkb

我正在从 SQL*Plus 运行该脚本。如果 pkg_t.pkb 无效,我会看到:

Warning: Package created with compilation errors.

但 SQL*Plus 不退出。据我所知,pkg_t.pkb 有一个 PL/SQL 错误编译,它与 SQL 错误不同。

需要添加什么指令才能使 SQL*Plus 在遇到 PL/SQL 编译错误时退出?

最佳答案

您收到的警告并不完全是 PL/SQL 错误或 SQL 错误。 PL/SQL 运行时错误会导致类似 ORA-06550 的错误,每当 sqlerror 都会捕获该错误,并且脚本会以该代码退出。不过,您会看到一个编译错误,这是不同的,并且是由客户端生成的。

捕获它的一种方法是检查数据字典中存储的错误:

WHENEVER SQLERROR EXIT SQL.SQLCODE

@pkg_t.pks
@pkg_t.pkb

declare
l_errors pls_integer;
begin
select count(*) into l_errors from user_errors;
if l_errors > 0 then
raise_application_error(-20001, 'Stored PL/SQL has compilation errors');
end if;
end;
/

exit 0;

如果包规范或主体出现错误,则计数将不为零,您将看到:

declare
*
ERROR at line 1:
ORA-20001: Stored PL/SQL has compilation errors
ORA-06512: at line 6

您还可以在user_objects中检查对象状态。如果你想检查一个特定的对象,你可以给它命名,但这会降低它的灵活性;如果您预计周围存在其他现有的无效对象,则可能有必要这样做。保持通用意味着您可以拥有一个单独的脚本,您可以重复调用该脚本以尽早捕获错误,例如 check_errors.sql 仅包含:

declare
l_errors pls_integer;
begin
select count(*) into l_errors from user_errors;
if l_errors > 0 then
raise_application_error(-20001, 'Stored PL/SQL has compilation errors');
end if;
end;
/

然后你可以这样做:

@pkg_t.pks
@check_errors
@pkg_t.pkb
@check_errors

当然,您可以使脚本更加精美并进行其他检查。如果您现有的 .pks 和 .pkb 脚本尚未这样做,您可以添加显示错误,以便您看到实际问题。


关于SQL.SQLCODE的旁注。这将有实际的错误代码,例如6550 或 20001。但是大多数 shell 只允许错误代码达到更小的值,例如127 或 255。这意味着实际的错误代码将“换行”,因此它不太可能有意义,但更重要的是,可能有一个错误代码恰好换行为零 - 这意味着如果您正在检查返回代码,可能会误以为成功了。例如,如果我这样做了:

raise_application_error(-20224, 'Stored PL/SQL has compilation errors');

那么 -20224 值将换行为零; SQL*Plus 将退出并显示该代码,但如果我在 bash 中检查 $? ,它将是 0,而且看起来好像已经成功了。类似地,-20223 将换行为 255,而 -20225 将换行为 1 - bash 会将两者视为错误,但不会给出实际错误是什么的指示。

所以使用固定值会更安全。我经常只使用每当sql错误退出失败,通常添加回滚,尽管如果您只执行DDL,那么这并不相关。

关于oracle - 当 PL/SQL 编译失败时如何让 SQL*Plus 退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35903059/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com