Shell 腳本呼叫 SQL*Plus 時,常需將查詢結果(如日期、序列值、統計數)傳回 Shell 變數後續使用。本文介紹 HOST 命令法與 Command Substitution 兩種主流做法。
在 SQL*Plus 腳本中用 COLUMN ... NEW_VALUE 捕獲查詢結果,再以 HOST 呼叫 Shell 命令(或直接 echo 供外層捕獲)。
#!/bin/bash
# a.sh
sqlplus -S "/ as sysdba" <
執行結果:
$ ./a.sh
today is 2005-04-11
關閉所有格式化輸出,讓 SQL*Plus 只輸出純值,Shell 用 $(...) 或反引號捕獲。
#!/bin/ksh
# a.sh
VALUE=`sqlplus -S "/ as sysdba" << END
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
SELECT MAX(SEQUENCE#) FROM V\$LOG_HISTORY;
EXIT;
END`
if [ -z "$VALUE" ]; then
echo "No rows returned from database"
exit 0
else
echo "Max Sequence Number: $VALUE"
fi
執行結果:
$ ./a.sh
Max Sequence Number: 17
| 選項 | 作用 |
|---|---|
-S / SILENT | 隱藏版權資訊、連線提示,只輸出查詢結果 |
SET PAGESIZE 0 | 關閉分頁,避免標題重複 |
SET FEEDBACK OFF | 隱藏「N rows selected.」 |
SET VERIFY OFF | 隱藏替換變數前後對照 |
SET HEADING OFF | 隱藏欄位標題 |
SET ECHO OFF | 隱藏執行的 SQL 陳述式 |
用特定分隔符(如 |)串聯多欄位,Shell 端再 IFS='|' read -r var1 var2 ... 拆解:
SELECT col1 || '|' || col2 || '|' || col3 FROM table WHERE ...;
$?)僅反映 SQL*Plus 執行狀態,不代表 SQL 成功與否;需在 SQL 中自行 WHENEVER SQLERROR EXIT FAILURE 或解析輸出判斷。/ as sysdba(OS 認證)或 Wallet / External Password Store。