linux/unix shell指令碼中呼叫或執行sql,rman 等為自動化作業以及多次反覆執行提供了極大的便利,因此通過linux/unix shell來完成oracle的相關工作,也是dba必不可少的技能之一。本文針對linux/unix shell指令碼呼叫sql, rman 指令碼給出了相關示例。
一、由shell指令碼呼叫sql,rman指令碼
1、shell指令碼呼叫sql指令碼
#首先編輯sql檔案
oracle@szdb:~> more dept.sql
connect scott/tiger
spool /tmp/dept.lst
set linesize 100 pagesize 80
select *fromdept;
spool off;
exit;
#編輯shell指令碼檔案,在shell指令碼內呼叫sql指令碼
oracle@szdb:~> more get_dept.sh
#!/bin/bash
# set environment variable
if[ -f ~/.bashrc ]; then
. ~/.bashrc
fi
export oracle_sid=cnmmbo
sqlplus -s /nolog @/users/oracle/dept.sql #注意此處執行sql指令碼的方法 -s 表示以靜默方式執行
exit
#授予指令碼執行許可權
oracle@szdb:~> chmod 775 get_dept.sh
-->執行shell指令碼
oracle@szdb:~> ./get_dept.sh
deptno dname loc
---------- -------------- -------------
10 accounting new york
20 research dallas
30 sales chicago
40 operations boston
2、shell指令碼呼叫rman指令碼
#首先編輯rman指令碼
oracle@szdb:~> more rman.rcv
run
#編輯shell指令碼檔案,在shell指令碼內呼叫rman指令碼
oracle@szdb:~> more rman_bak.sh
#!/bin/bash
# set environment variable
if[ -f ~/.bashrc ]; then
. ~/.bashrc
fi
export oracle_sid=cnmmbo
$oracle_home/bin/rman target / cmdfile=/users/oracle/rman.rcv log=/users/oracle/bak/rman.log
exit
#授予指令碼執行許可權
oracle@szdb:~> chmod 775 rman_bak.sh
#執行shell指令碼
oracle@szdb:~> ./rman_bak.sh
二、嵌入sql語句及rman到shell指令碼
1、直接將sql語句嵌入到shell指令碼
oracle@szdb:~> more get_dept_2.sh
#!/bin/bash
# author : robinson cheng
# blog :
# set environment variable
if[ -f ~/.bashrc ]; then
. ~/.bashrc
fi
export oracle_sid=cnmmbo
sqlplus -s /nolog <#eof在此表示當輸入過程中碰到eof後,整個sql指令碼輸入完畢
connect scott/tiger
spool /tmp/dept.lst
set linesize 100 pagesize 80
select *fromdept;
spool off;
exit; #退出sqlplus 環境
eof
exit #推出shell指令碼
#授予指令碼執行許可權
oracle@szdb:~> chmod u+x get_dept_2.sh
#執行shell指令碼
oracle@szdb:~> ./get_dept_2.sh
deptno dname loc
---------- -------------- -------------
10 accounting new york
20 research dallas
30 sales chicago
40 operations boston
2、直接將sql語句嵌入到shell指令碼(方式二,使用管道符號》代替spool來輸出日誌)
oracle@szdb:~> more get_dept_3.sh
#!/bin/bash
# set environment variable
if[ -f ~/.bashrc ]; then
. ~/.bashrc
fi
export oracle_sid=cnmmbo
sqlplus -s /nolog 1>/users/oracle/dept.log 2>&1 <
connect scott/tiger
set linesize 80 pagesize 80
select *fromdept;
exit;
eof
cat /users/oracle/dept.log
exit
#另一種實現方式,將所有的sql語句輸出來生成sql指令碼後再呼叫
oracle@szdb:~> more get_dept_4.sh
#!/bin/bash
# set environment variable
if[ -f ~/.bashrc ]; then
. ~/.bashrc
fi
export oracle_sid=cnmmbo
echo "conn scott/tiger
select *fromdept;
exit;" >/users/oracle/get_dept.sql
sqlplus -silent /nolog @get_dept.sql 1>/users/oracle/get_dept.log 2>&1
cat get_dept.log
exit
3、將rman指令碼嵌入到shell指令碼
oracle@szdb:~> more rman_bak_2.sh
#!/bin/bash
# set environment variable
if[ -f ~/.bashrc ]; then
. ~/.bashrc
fi
export oracle_sid=cnmmbo
$oracle_home/bin/rman log=/users/oracle/bak/rman.log run
exit;
eof
exit
#授予指令碼執行許可權
oracle@szdb:~> chmod u+x rman_bak_2.sh
#執行shell指令碼
oracle@szdb:~> ./rman_bak_2.sh
rman> rman> 2> 3> 4> 5> 6> 7> 8> 9> 10> 11> 12> 13> 14> 15> 16> 17> 18> 19> 20> 21> rman> oracle@szdb:~>
shell指令碼中呼叫其他指令碼
目前來說有三種方法 1.指令碼絕對路徑 這個方式是最普通的,底層呼叫的是fork實現,執行的時候開乙個子shell執行呼叫的指令碼,子shell執行的時候,父shell還在 子shell執行完畢後返回父shell,子shell從父shell繼承環境變數,但是子shell中的環境變數不會帶回父shel...
使用system()函式呼叫Linux指令碼
system 函式在函式庫中,通過他可以呼叫linux中的指令碼。具體使用可以用 man system來看。這個函式就乙個引數,就是你要執行的命令的字串。比如,呼叫的指令碼位於 home usr joker test.sh,那麼就可以這樣在c c 中呼叫system home usr joker t...
使用system()函式呼叫Linux指令碼
system 函式在函式庫中,通過他可以呼叫linux中的指令碼。具體使用可以用 man system來看。這個函式就乙個引數,就是你要執行的命令的字串。比如,呼叫的指令碼位於 home usr joker test.sh,那麼就可以這樣在c c 中呼叫system home usr joker t...