簡體   English   中英

Shell 腳本中的 SQL*Plus:將 COUNT(*) 發送到變量,將錯誤發送到文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM