使用批處理指令碼或SHELL配合SQL指令碼

charsi發表於2010-11-19

有時候我們在寫一些資料庫指令碼的時候,通過SQLPLUS設定變數可能很麻煩.此時可以利用作業系統的指令碼.
比如當系統為*NIX時可以使用SHELL指令碼,當系統為Windows時可以通過批處理指令碼配合使用.

下面是兩種平臺的兩個示例:
(1)UNIX或Linux平臺
下面這個指令碼,是通過在系統中取得當前時間的年月,然後傳遞給SQLPLUS拼成表的分割槽,可以用來優化SQL

TESTDB /oravl01/oracle/charsi> cat xx_test.sh
CUR_MONTH=`date +%Y%m`

sqlplus charsi/charsi@testdb <set timing on
select count(1)
from test_parti_table partition (month_${CUR_MONTH}) t
where t.object_id in (10, 20, 30)
and t.create_time > (sysdate - 1 / 96);
EOF

TESTDB /oravl01/oracle/charsi>
TESTDB /oravl01/oracle/charsi>

上面這個是一個監控指令碼,實時取15分鐘之內的資料,本例僅僅是用來演示從系統向sqlplus中傳遞變數的.


(2)Windows平臺
下面是一個windows批處理指令碼示例,模擬的是通過系統向sqlplus中傳遞變數,然後執行sql
非常感謝itpub上xqmei的答覆

檔案xxxx.bat的內容為:

@echo off
@set aa=test_charsi
set ORACLE_SID=ORCLXX
if "%1"=="__get_sql" goto :get_sql

%0 __get_sql | sqlplus "/ as sysdba"
goto :end
:get_sql
echo set timing on
echo select * from dual;
echo select '%aa%' from dual;
echo exit;
:end

執行該指令碼
C:9_TMP>xxxx.bat

SQL*Plus: Release 9.2.0.1.0 - Production on 星期六 11月 20 18:36:02 2010

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.


連線到:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production

SQL> SQL>
DU
--
X

已用時間: 00: 00: 00.00
SQL>
'TEST_CHARSI'
----------------------
test_charsi

已用時間: 00: 00: 00.00
SQL> 從Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production中斷開

C:9_TMP>

該指令碼含義一個簡單介紹:
@echo off ----echo off前面加@,就是在介面上不顯示"echo off"
@set aa=test_charsi ----設定aa變數
set ORACLE_SID=ORCLXX ---設定ORACLE_SID
if "%1"=="__get_sql" goto :get_sql -----如果該指令碼的第一個引數為__get_sql,則跳轉到:get_sql

%0 __get_sql | sqlplus "/ as sysdba" -----執行:指令碼名 __get_sql |sqlplus "/ as sysdba"。%0的意思是當前執行的指令碼,相當於在指令碼中執行了該指令碼

goto :end
:get_sql ----設定get_sql中的內容
echo set timing on
echo select * from dual;
echo select '%aa%' from dual;
echo exit;
:end


當然在Windows下完全可以先把檔案生成出來再通過sqlplus "/ as sysdba" @sql_script.sql來執行,這樣也比較簡潔直觀,本例僅僅是作為演示.

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23850820/viewspace-1041798/,如需轉載,請註明出處,否則將追究法律責任。

相關文章