2013-02-06 50 views
12
#!/bin/sh 

echo "Please enter evaluate database username" 
read eval_user 
echo "Please enter evaluate database password" 
read eval_pass 
echo "Please enter the database name" 
read db_name 

LOGFILE=shell_log.txt 

$ORACLE_HOME/bin/sqlplus -s /nolog <<-EOF>> ${LOGFILE} 
connect $eval_user/[email protected]$db_name 
WHENEVER OSERROR EXIT 9; 
WHENEVER SQLERROR EXIT SQL.SQLCODE; 
DBMS_OUTPUT.put_line('Connected to db'); 
EOF 

if [ $? != 0 ] 
then 
echo "The upgrade script failed. Please refer to the log results.txt for more information" 
echo "Error code $?" 
exit 0; 
fi 

Tôi đang nhập các giá trị rác cố gắng buộc tập lệnh này thất bại. Nhưng, khó chịu, nó tiếp tục di chuyển về phía trước mà không có bất kỳ đề cập đến bất kỳ mã lỗi. Điều gì khác cần phải được thực hiện ở đây?Quản lý xử lý lỗi khi chạy sqlplus từ tập lệnh shell

+0

Bạn đang chạy tài khoản người dùng OS nào? Tập lệnh cơ sở dữ liệu đăng nhập vào cơ sở dữ liệu nào? – APC

+0

Tôi đã thử tập lệnh của bạn và tệp nhật ký đang ghi lại mã lỗi. Đây là lấy từ tệp nhật ký: 'ERROR: ORA-01017: tên người dùng/mật khẩu không hợp lệ; đăng nhập bị từ chối SP2-0734: không biết lệnh bắt đầu "DBMS_OUTPU ..." - phần còn lại của dòng bị bỏ qua.' – Incognito

+0

Tôi biết, bạn đang nhận được gì trong tệp nhật ký khi bạn thực thi tập lệnh? – Incognito

Trả lời

11

Điều Max nói là chính xác. Hãy thử tập lệnh được sửa đổi này

#!/bin/sh 

echo "Please enter evaluate database username" 
read eval_user 
echo "Please enter evaluate database password" 
read eval_pass 
echo "Please enter the database name" 
read db_name 

LOGFILE=shell_log.txt 

sqlplus -s /nolog <<-EOF>> ${LOGFILE} 
WHENEVER OSERROR EXIT 9; 
WHENEVER SQLERROR EXIT SQL.SQLCODE; 
connect $eval_user/[email protected]$db_name 
DBMS_OUTPUT.put_line('Connected to db'); 
EOF 

sql_return_code=$? 

if [ $sql_return_code != 0 ] 
then 
echo "The upgrade script failed. Please refer to the log results.txt for more information" 
echo "Error code $sql_return_code" 
exit 0; 
fi 

Hãy lưu ý sử dụng sql_return_code để nắm bắt mã trả về SQLPLUS.

Câu lệnh DBMS_OUTPUT không thành công với lỗi - "SP2-0734: không rõ lệnh bắt đầu ...". Bạn có thể tìm thấy thông báo lỗi trong tệp nhật ký.

Có thể bẫy các lỗi sp2 trong SQLPLUS 11g bằng cách sử dụng cơ sở ghi lỗi. Vui lòng xem http://tkyte.blogspot.co.uk/2010/04/new-thing-about-sqlplus.html để biết thêm thông tin.

+0

Tôi chỉ nhận được mã lỗi 122, thay vì thông báo lỗi db thực tế. Bạn có biết cách để nắm bắt đầu ra không? – roymustang86

+0

Thông báo lỗi được chuyển hướng đến "shell_log.txt". Hãy xem tệp đó trong thư mục hiện tại của bạn. Nếu bạn muốn nắm bắt đầu ra trong kịch bản lệnh shell, bạn cần phải loại bỏ chuyển hướng và gán đầu ra của SQLPLUS cho một biến. Ví dụ: - 'SQL_RESULT = $ (sqlplus -s/nolog << EOF KHI BAO GIỜ SQLERROR EXIT FAILURE WHENEVER OSERROR EXIT FAILURE SET SERVEROUTPUT ON kết nối $ eval_user/$ eval_pass @ $ db_name exec DBMS_OUTPUT.put_line ('Kết nối với db'); thoát EOF) ' –

+2

Kịch bản lệnh shell trong hệ điều hành UNIX có thể trả về mã tối đa 255. Vì vậy, tôi không hiểu cách WHENEVER SQLERROR EXIT SQL.SQLCODE; có thể trả lại mã SQL ở trên 255 không? Ví dụ: ORA-12703 chuyển đổi bộ ký tự này không được hỗ trợ Thực ra tôi vừa thực hiện một thử nghiệm và chạy một SQL xấu không thành công với ORA-00936: thiếu biểu thức sqlplus xấu trả về 168 (!) Vì vậy, mã trả về thực tế 936 được gói và chỉ còn lại đã được trả lại. 936% 256 = 168. Đây không phải là câu trả lời đúng. – Tagar

5

có thể xảy ra các câu lệnh bất cứ khi nào bạn thực hiện sau khi kết nối với db đã được thiết lập (vì bạn đã đề cập đến chúng sau đó). Hãy thử các mã sau: -

$ORACLE_HOME/bin/sqlplus -s /nolog <<-EOF>> ${LOGFILE} 
WHENEVER OSERROR EXIT 9; 
WHENEVER SQLERROR EXIT SQL.SQLCODE; 
connect $eval_user/[email protected]$db_name 
DBMS_OUTPUT.put_line('Connected to db'); 
EOF 
1

Thực tế bạn đang nhập giá trị giả mạo, có lẽ chỉ liên quan đến thông tin đăng nhập. Sau đó: Check database connectivity using Shell script

WHENEVER ... là lỗi trong khi thực thi tập lệnh SQL. Khi bạn đã kết nối thành công với tập lệnh của mình (tôi cho rằng đây là vấn đề của bạn ngay bây giờ), bạn sẽ nhận được loại lỗi do WHENEVER ERROR quản lý vì bạn đã quên EXEC tại dòng của mình với DBMS_OUTPUT.

0

Bạn chỉ có thể bẫy lỗi sql hoặc lỗi hệ điều hành. Các dbms_output sẽ thất bại ở mức sqlplus chính nó để thiết lập lỗi bất cứ khi nào không ảnh hưởng đến nó.

3

câu trả lời Aji với

WHENEVER SQLERROR EXIT SQL.SQLCODE; 

và sau đó sử dụng

sql_return_code=$? 

là không đúng (hoặc không đúng trong hầu hết các trường hợp). Xem chi tiết bên dưới.


Shell script trong hệ điều hành UNIX có thể trả về mã tối đa 255. Ví dụ: "ORA-12703 chuyển đổi bộ ký tự này không được hỗ trợ" mã trả về phải là 12703, nhưng nó không phù hợp với mã trả về UNIX 8 bit.
Thực ra tôi vừa thực hiện một thử nghiệm và chạy một câu lệnh SQL không thành công với "ORA-00936: biểu thức bị thiếu" -
sqlplus trả lại 168 (!).
Vì vậy, mã trả lại thực tế 936 được gói ở 256 và phần còn lại đã được trả lại. 936% 256 = 168.


Trên Windows, điều này có thể hoạt động (không được kiểm tra), nhưng không hoạt động trên UNIX (được kiểm tra như đã giải thích ở trên).


Cơ chế đáng tin cậy duy nhất có lẽ là để ống chỉ kết quả vào một tập tin đăng nhập và sau đó làm một cái gì đó giống như

tail -n 25 spool.log | egrep "ORA-" | tail -n 1 | cut -d: -f1 | cut -d- -f2 

Vì vậy, nó sẽ grep file ống chỉ đăng nhập và sau đó cắt thực tế ORA-mã mới nhất.