首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

SQL*Plus 向 Shell 傳遞變數的兩種實用技巧

     編輯:Oracle 資料庫基礎

Shell 腳本呼叫 SQL*Plus 時,常需將查詢結果(如日期、序列值、統計數)傳回 Shell 變數後續使用。本文介紹 HOST 命令法與 Command Substitution 兩種主流做法。

方法一:SQL*Plus 內建 HOST 命令 + 替換變數

在 SQL*Plus 腳本中用 COLUMN ... NEW_VALUE 捕獲查詢結果,再以 HOST 呼叫 Shell 命令(或直接 echo 供外層捕獲)。

#!/bin/bash
# a.sh
sqlplus -S "/ as sysdba" <

執行結果:

$ ./a.sh
today is 2005-04-11

方法二:Command Substitution 直接捕獲標準輸出

關閉所有格式化輸出,讓 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

關鍵 SET 選項說明

選項作用
-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*Plus 回傳碼($?)僅反映 SQL*Plus 執行狀態,不代表 SQL 成功與否;需在 SQL 中自行 WHENEVER SQLERROR EXIT FAILURE 或解析輸出判斷。
  • 生產環境避免在腳本明文寫密碼,改用 / as sysdba(OS 認證)或 Wallet / External Password Store。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved