2010-08-06 79 views
5

我一直試圖弄清楚這一點,現在我認爲是時候尋求幫助了。我正在構建一個模式配置腳本,我想添加一些腳本輸出和錯誤處理。這個想法是,腳本輸出窗口只會顯示沒有所有噪音的關鍵信息。Oracle腳本中的錯誤處理

Create Temporary Error Table 
Begin Transaction 

-- begin work block 
Print "Doing some types of work" 
-- do work here 

If Error and Active Transactions > 0 Then Rollback 
If Active Transactions = 0 Then Insert Error In Temp Error Table and Start Another Transaction 
-- end work block 

-- once all all work complete 
If Active Transactions > 0 Then Commit Transactions 

在SQL Server的世界,我通常只用Red Gate's SQL Packager做到這一點已經想通了(暗示,暗示紅門 - 我們需要一個Oracle版本:))。關於從哪裏開始獲得類似的東西的任何想法?

+2

_I構建一個架構供應腳本_如果你的意思是你正在創建/改變表等,回滾將無濟於事。在Oracle中,DDL命令提交當前事務(如果有未完成事務),在事務中運行自己並提交成功,則在失敗時進行回滾。因此,在運行DDL命令之後,不會有未完成的事務。唯一的例外是如果存在解析錯誤,那麼數據庫不知道它應該運行DDL命令,並且不會執行第一個隱式提交,也不會爲DDL啓動事務。這與SQL Server非常不同。 – 2010-08-07 04:49:59

+0

我的評論沒有提供答案,只是在那裏指出你可能會或可能沒有意識到的一個陷阱。 – 2010-08-07 04:51:15

+0

@Shannon - 謝謝,這真的很糟糕,你不能做更廣泛的範圍交易,包括DDL。在配置過程中,如果出現問題,將數據庫置於半燒烤狀態,這確實會使錯誤處理變得更加困難。 – 2010-08-09 14:33:39

回答

2

在Oracle中,可以定義事務邊界 - 你提交時,即可大功告成,而每個語句是原子。

如果你使用SQL * Plus和你不希望在所有任何承諾,如果出現任何錯誤,你可以做放在SQL腳本如下:

SET ECHO ON 
SPOOL /some/path/to/logfile.log 
WHENEVER SQLERROR EXIT SQL.CODE ROLLBACK 

-- run your code or DML statements 

COMMIT; 
EXIT; 

這將彈了出來它第一次遇到錯誤,所以錯誤語句將在日誌文件的末尾。它還將回滾所有更改,因此只要沒有任何COMMIT(或導致它們的語句,如CREATE, ALTER, DROP, GRANTREVOKE),那麼整個升級就是全部或全無。

0

在我看到的大多數情況下,這些(重複)任務都是使用腳本自動執行的。

我們目前做的一種方法是UNIX腳本,它運行給定目錄中的所有.sql文件並生成.log文件。在這個過程的最後,我們grep日誌文件,看看是否有任何錯誤。

您不需要手動打印任何錯誤,因爲sqlplus已經打印出錯誤,並將其記錄在日誌文件中。

下面是一個非常簡單的例子...

.ksh文件

#!/usr/bin/ksh 
echo "Starting provisioning script.." 

sqlplus scott/[email protected] > file1.log << ! 
@file1.sql 
@file1.sql 
! 

echo "end of provisioning script" 

而且file1.sql的內容(這是在同一個目錄在這個例子中)

create table test123(
    id number, 
    name varchar2(200) 
); 

當我運行這個腳本,第一次創建成功,第二次失敗..日誌文件將.. .. .. ..

SQL*Plus: Release 10.2.0.4.0 - Production on Fri Aug 6 20:44:08 2010 

Copyright (c) 1982, 2007, Oracle. All Rights Reserved. 


Connected to: 
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production 
With the Partitioning, OLAP, Data Mining and Real Application Testing options 

SQL> 
Table created. 

SQL> create table test123(
      * 
ERROR at line 1: 
ORA-00955: name is already used by an existing object 


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

您可以沿着這些行準備一個腳本,然後查看日誌文件中的任何錯誤..一旦執行完成。你可以使用各種sqlplus會話命令來擺脫所有不需要的註釋等。

我不知道有任何自動化工具可以做到這一點。我之所以一直

希望這有助於...

+0

我試圖遠離混合shell腳本,如果可能的話。創建太多的依賴關係。 – 2010-08-09 14:32:15