簡體   English   中英

PL / SQL編譯失敗時如何使SQL * Plus退出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM