在最近的工作中,經常需要批量執行一些DML, DDL, PL/SQL語句或導入一些Function, Procedure。因為support的國家比較多,常常需要一個登陸到一個國家的數據庫上執行完成后再登陸到另一個國家執行,很是麻煩。今天得空就寫了個shell來批量處理。
#Env.sh中定義一常用的變量,ORACLE_SID,$AU_USER,$AU_PWD等。
. /home/oracle/shell/Env.shAU="$AU_USER/$AU_PWD"
CN="$CN_USER/$CN_PWD"
US="$US_USER/$US_PWD"
UK="$UK_USER/$UK_PWD"#把所有國家的數據庫連接信息放入到一個數組中
set -A ctl_list $AU $CN $US $UK#對數組進行循環遍歷,取出數據庫連接信息;
#用spool...append收集執行情況信息;
#"@/home/oracle/shell/load.sql;"執行load.sql文件
for i in ${ctl_list[@]}
do
sqlplus -L $i@$ORACLE_SID <<EOF
set serveroutput on;
spool /home/oracle/shell/load.log append
@/home/oracle/shell/load.sql;
spool off
QUIT
EOF
done
#用“@”執行sql文件時,如果每條sql后面要跟上“;”,如果有pl/sql代碼,需要在最后加上“/”。
[oracle@toughhou shell]$ cat load.sql
create table student(
st_no number primary key,
st_name varchar2(10)
);insert into student(st_no,st_name) values(1001,"Tough1");
insert into student(st_no,st_name) values(1002,"Tough2");
insert into student(st_no,st_name) values(1003,"Tough3");
insert into student(st_no,st_name) values(1004,"Tough4");alter table student add (age number);
create or replace procedure my_proc
as
begin
dbms_output.put_line("Date: " || sysdate);
end my_proc;
/