[英]Can I make SQL*Plus exit with an error on function compilation failure?
[英]How can I make SQL*Plus exit when PL/SQL compilation fails
我的腳本文件具有以下代碼:
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錯誤不同。
需要添加什么指令,以便在遇到PL / SQL編譯錯誤時SQL * Plus退出?
您得到的警告不是一個PL / SQL錯誤或一個SQL錯誤。 PL / SQL運行時錯誤將導致類似ORA-06550的錯誤, whenever 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腳本尚未這樣做,則可以添加show errors
以便您看到實際的問題。
有關SQL.SQLCODE
的附帶說明。 這將具有實際的錯誤代碼,例如6550或20001。但是大多數外殼程序僅允許最大較小值的錯誤代碼(例如127或255)。這意味着實際的錯誤代碼將“自動換行”,因此不太可能有意義,但是更重要的是,錯誤代碼可能會自動換為零,這意味着如果您檢查返回代碼,可能會誤以為成功。 例如,如果我做了:
raise_application_error(-20224, 'Stored PL/SQL has compilation errors');
然后-20224的值將換為零; SQL * Plus將退出該代碼,但是如果我檢查了$?
在bash中它將為0
,並且看起來已經成功了。 類似地,-20223將換為255,而-20225將換為1-bash將兩者都視為錯誤,但不會給出實際錯誤的指示。
因此,使用固定值會更安全。 我經常只whenever sql error exit failure
(通常添加rollback
,盡管如果您僅執行DDL則不相關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.