CREATE TABLE log (
PROBLEMID VARCHAR2(40),
PROBLEMNAME VARCHAR2(260),
PROBLEMLEVEL VARCHAR2(40),
PROBLEMORDER VARCHAR2(260),
PARENTID VARCHAR2(40),
ROOTTYPEDESC VARCHAR2(260),
IFLEAF VARCHAR2(40),
MEMO VARCHAR2(1000),
IFVALID VARCHAR2(40),
ROOTTYPE VARCHAR2(20)
);
EXIT;
@ECHO OFF
REM 連線字串:用戶/密碼@TNS別名
REM 輸出導向 log.txt 記錄執行結果
sqlplus cssp/cssp@gxCSSp @H:\bat_sql\log.sql > log.txt
EXIT
SQL*Plus: Release 10.1.0.2.0 - Production on Thu Apr 7 18:26:03 2011
Copyright (c) 1982, 2004, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
Table created.
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
資料庫中確認 LOG 表已成功建立。
假設資料庫已存在預存程序 PRODUCE_LOG,修改 SQL 檔內容為:
EXEC PRODUCE_LOG;
EXIT;
批次檔不變,執行即可調用預存程序。若需傳參數,SQL 寫法:EXEC PRODUCE_LOG('param1', 123);
| 需求 | 做法 |
|---|---|
| 隱藏密碼 | 使用 sqlplus /nolog 搭配腳本內 CONN user/pass@tns,或採用 Oracle Wallet |
| 錯誤處理 | SQL 腳本加入 WHENEVER SQLERROR EXIT FAILURE ROLLBACK,批次檔檢查 %ERRORLEVEL% |
| 多腳本依序執行 | 批次檔依序呼叫多個 sqlplus ... @script.sql,或建立主腳本 @master.sql 內含 @script1.sql @script2.sql |
| 記錄時間戳 | 批次檔開頭 ECHO %DATE% %TIME% >> log.txt |
| 無互動模式 | 加入 SET FEEDBACK OFF VERIFY OFF HEADING OFF PAGESIZE 0 乾淨輸出 |
#!/bin/bash
# run_sql.sh
export ORACLE_HOME=/u01/app/oracle/product/11.2.0
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=ORCL
sqlplus -s /nolog < /tmp/sql_output.log
CONN user/pass
@/scripts/myscript.sql
EXIT
EOF
# 檢查執行狀態
if [ $? -eq 0 ]; then
echo "SQL executed successfully"
else
echo "SQL execution failed"
fi
結語:批次檔結合 SQL*Plus 是 Oracle 自動化部署、排程維護、資料遷移的輕量級利器。掌握導向輸出、錯誤捕獲與無互動模式,可構建穩健的自動化流程。