2010-08-06 32 views
5

Tôi đã cố gắng tìm hiểu điều này một chút và tôi nghĩ đã đến lúc yêu cầu trợ giúp .. Tôi đang xây dựng kịch bản cung cấp lược đồ và tôi muốn thêm một số đầu ra tập lệnh và xử lý lỗi. Ý tưởng là cửa sổ đầu ra kịch bản sẽ chỉ hiển thị cho tôi các thông điệp chính mà không có tất cả tiếng ồn.Xử lý lỗi trong Tập lệnh 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 

Trong SQL Server trên thế giới tôi sẽ thường chỉ làm điều này với Red Gate's SQL Packager đã nó đã tìm ra (gợi ý, gợi ý Red Gate - chúng ta cần một phiên bản Oracle :)). Bất kỳ suy nghĩ về nơi để bắt đầu với Oracle để có được một cái gì đó tương tự?

+2

_Tôi đang xây dựng một tập lệnh cung cấp lược đồ_ Nếu bạn có nghĩa là bạn đang tạo/thay đổi các bảng và như vậy; rollback sẽ không giúp ích gì. Trong Oracle, một lệnh DDL cam kết giao dịch hiện tại, nếu một giao dịch xuất sắc, tự chạy trong một giao dịch và cam kết thành công, hãy quay trở lại thất bại. Vì vậy, sau khi chạy lệnh DDL sẽ không có giao dịch chưa thanh toán.Ngoại lệ duy nhất là nếu có lỗi phân tích cú pháp, thì DB không biết rằng nó được cho là chạy lệnh DDL và sẽ không thực hiện cam kết ngầm định đầu tiên, cũng như không bắt đầu giao dịch cho DDL. Điều này rất khác với SQL Server. –

+0

Nhận xét của tôi không cung cấp câu trả lời, nó chỉ ở đó để chỉ ra một sự cố mà bạn có thể hoặc có thể không nhận thức được. –

+0

@Shannon - Cảm ơn, điều đó thực sự khiến bạn không thể thực hiện một giao dịch phạm vi rộng hơn bao gồm DDL. Nó thực sự làm cho lỗi xử lý nhiều khó khăn hơn trong quá trình cung cấp bằng cách để cơ sở dữ liệu trong trạng thái nửa nướng nếu có điều gì đó không ổn. –

Trả lời

2

Trong Oracle, bạn xác định ranh giới giao dịch - bạn cam kết khi bạn đã hoàn tất, và mỗi câu lệnh là nguyên tử.

Nếu bạn đang sử dụng SQL * Plus và bạn không muốn bất cứ điều gì ở tất cả các cam kết nếu bất cứ điều gì sai, bạn có thể làm đặt sau đây trong kịch bản SQL:

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

-- run your code or DML statements 

COMMIT; 
EXIT; 

này sẽ đánh bom ra lần đầu tiên nó gặp lỗi, do đó báo cáo lỗi sẽ nằm ở cuối tệp nhật ký. Nó cũng sẽ khôi phục bất kỳ thay đổi nào, miễn là không có bất kỳ COMMIT s (hoặc các phát biểu nào gây ra chúng, như CREATE, ALTER, DROP, GRANT hoặc REVOKE), thì toàn bộ quá trình nâng cấp là tất cả hoặc không có gì.

0

Trong hầu hết các trường hợp tôi đã thấy, các tác vụ như vậy (lặp lại) được tự động sử dụng tập lệnh.

Một cách chúng tôi thực hiện hiện tại là tập lệnh UNIX chạy tất cả các tệp .sql trong thư mục đã cho và tạo tệp .log. Vào cuối quá trình, chúng tôi grep tệp nhật ký và xem có bất kỳ lỗi nào không.

Bạn không cần in bất kỳ lỗi nào theo cách thủ công, vì sqlplus đã in ra lỗi và nó được ghi lại trong tệp nhật ký.

Dưới đây là một ví dụ rất đơn giản ...

.ksh tập tin

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

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

echo "end of provisioning script" 

Và nội dung của file1.sql (đó là trong cùng thư mục ví dụ này)

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

khi tôi chạy tập lệnh này, lần đầu tiên tạo thành công và tập lệnh thứ hai không thành công..và tệp nhật ký sẽ là .. như ..

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 

Bạn có thể chuẩn bị tập lệnh theo các dòng này .. sau đó tìm bất kỳ lỗi nào trong tệp nhật ký .. sau khi quá trình thực hiện hoàn tất. Bạn có thể sử dụng các lệnh phiên sqlplus khác nhau để loại bỏ tất cả các nhận xét không mong muốn và như vậy.

Tôi không biết bất kỳ công cụ tự động nào cũng làm như vậy. Lý do tôi đã luôn

Hope this helps ...

+0

Tôi đang cố gắng tránh xa việc trộn các tập lệnh shell nếu có thể. Tạo quá nhiều phụ thuộc. –