[英]SQL*Plus in Shell Script: Send COUNT(*) to Variable, Error to File
我正在從 Korn shell (ksh) 調用 Oracle SQL*Plus。
我的最終目標是將 SQL 語句的COUNT(*)
的值獲取到 shell 腳本變量中。
但是,如果引發 SQL 錯誤,我想完整報告 SQL 異常並終止腳本。
我很難將這兩種情況都考慮到讓我滿意。
#!/bin/ksh
test_count=$(sqlplus -s scott/tiger << EOF1
WHENEVER SQLERROR EXIT 1
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
SELECT COUNT(*) FROM scott.emp WHERE empno > 7777;
EXIT;
EOF1
)
sql_ret_code=$?
if [ $sql_ret_code -ne 0 ]
then
echo "Error encountered."
echo
exit 1
fi
echo "test_count = $test_count"
exit 0
在“快樂路徑”的情況下,上述工作(因為它顯示test_count = 8
)。
如果我通過引用一個不存在的表(例如,“ scott.emp_bogus
”)來模擬 SQL 錯誤,上面的代碼只打印通用消息“遇到錯誤”。 我更願意報告完整的 Oracle 異常,如下所示:
Error encountered.
SELECT COUNT(*) FROM scott.emp_bogus WHERE empno > 7777
*
ERROR at line 1:
ORA-00942: table or view does not exist
我一直在嘗試將我的stderr
重定向到一個文件,以便在出現異常時“ cat
”輸出,但隨后我的非錯誤條件輸出也被定向到該文件,這是我不想要的。
在沒有任何這樣的 SQL 錯誤的情況下,我更願意將COUNT(*)
的值定向到 shell 腳本變量test_count
。
如果,另一方面,SQL拋出一個異常,我寧願是錯誤定向到一個文件,然后cat
從我中的文件“時出現錯誤”條件/ if
條款。
是否可以?
謝謝你。
我可能會遺漏一些東西,但你擁有一切讓它工作!
exit 1
): 你不能在錯誤情況下退出,因為你想要顯示的錯誤在你的結果變量test_count
! 那么為什么不顯示它呢? 這是我可以提出的建議
[...]
if [ $sql_ret_code -ne 0 ]
then
echo "Error encountered."
echo
echo "ERROR: $test_count"
echo "abort."
exit 1
fi
echo "test_count = $test_count"
exit 0
(希望我沒有公然退出游戲;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.