2014-06-09 82 views
1

我想實現在shell腳本中的錯誤日誌記錄機制,這也給我的錯誤SQL語句記錄SQL錯誤

我打算從裏面另一個腳本和重定向打電話給我的劇本里錯誤到日誌文件.. 有沒有更好的選擇?請幫忙。

#!/bin/sh 

./test.sh 2>&1 >> log_1.log 

test.sh包含follwing代碼

## testing error logging in sql 

result=`sqlplus -s $username/[email protected]$db <<EOF 
set serveroutout on 
set pagesize 0 
set heading off 
set echo off 
set feedback off 
select first_name from employees; 
exit; 
EOF 
if [ $? -ne 0 ]; then 
    echo "Error exists" 
else 
echo "$result" 
fi 

---用於測試由亞歷克斯游泳池

我做了變化,但給出的代碼編輯後,每當我得到一個SQL錯誤,日誌文件沒有得到生成,而是錯誤顯示在命令行上。

腳本名稱-test_error_log.sh

#!/bin/sh 

output=`sqlplus -s -l hr/[email protected] << EOF 
whenever sqlerror exit failure rollback 
whenever oserror exit failure rollback 
set serveroutput on 
set heading off 
set pagesize 0 
set echo off 

select **e.firs_name --- wrong field name** 
     ,d.department_name from 
employees e , departments d 
where e.department_id=d.department_id ; 

exit; 
EOF` 

echo $output 

我從caller_shell.sh在以下方法調用它

腳本名稱:caller_shell.sh

#!/bin/sh 

./test_error_log.sh 2>&1 log_file 

當我執行命令行./caller_shell.sh我收到錯誤一個 但不是在LOG_FILE但在屏幕

ERROR at line 1: ORA-00904: "E"."FIRS_NAME": invalid identifier 

請讓我知道如何解決這個..

回答

2

您可以使用whenever sqlerror,使SQL * Plus的退出與一個錯誤代碼,shell腳本將看到返回代碼:

result=`sqlplus -l -s $username/[email protected]$db <<EOF 
whenever sqlerror exit failure rollback 
whenever oserror exit failure rollback 
set serveroutput on 
set pagesize 0 
set heading off 
set echo off 
set feedback off 
select first_name from employees; 
exit 0; 
EOF` 

它將退出時看到的錯誤,並沒有什麼後將嘗試失敗點。使用failure會使其成爲通用失敗代碼,但您可以根據自己的喜好指定特定值。但是,如果您使用自己的價值,請注意外殼限制;在大多數shell中,大於255的任何東西都會循環回零,因此嘗試使用SQL錯誤代碼退出並不是一個好主意,例如,您可能會得到一個真正的錯誤,在它被mod'ed後最終爲零。使用rollback意味着如果在腳本中途發生故障,它將回滾已經做出的任何(未提交的)更改。

這將捕獲SQL錯誤和PL/SQL錯誤(除非那些被異常處理程序捕獲並且不會重新生成),但不會捕獲SQL * Plus特定的錯誤 - 即從那些起始SP-,例如從命令無效set

我添加了一個-l標誌的sqlplus命令,使其只嘗試連接一次,這是一個非交互式腳本有益的 - 有時他們可以掛在等待後續的憑據,根據上下文和還有什麼在腳本中。我還修復了serveroutput的拼寫,並添加了缺少的反向...

+0

很好的解釋。用於'-l'選項的+1。 –

+0

@Alex先生非常感謝您。非常豐富。每當sqlerror退出失敗回滾時 – redsoxlost

+0

@Alex失敗包含什麼? sql err味精?我沒有這臺機器的機器,所以無法真正測試它。 – redsoxlost