在使用oracle时,总觉得oracle的导入,导出没有informix的load,unload好用,没办法,只能参照网上朋友的思路和informix的实现,写了几个脚本,希望各位高手指点:
=============================================
工具用法:
unload.sh
Usage: unload.sh userid/passwd[@oraclesid] [tabname]
注释:
如果不加’@oraclesid’,则用当前环境变量ORACLE_SID。
如果不加tabname参数,则处理该用户下的所有表,生成’表名.unl’文件。
如果加tabname参数,则单独处理该表,生成’表名.unl’文件。
load.sh
Usage: load.sh userid/passwd[@oraclesid] [tabname]
注释:
如果不加’@oraclesid’,则用当前环境变量ORACLE_SID。
如果不加tabname参数,则装载该用户下的所有表,必须存在’表名.unl’
文件。
如果加tabname参数,则单独处理该表,必须存在’表名.unl’文件。
=============================================
具体实现:
unload.sh
利用spool的功能,将表中的数据导出到对应的文本中。
load.sh
利用sql*load的功能,将文本中的数据导入到表中。
控制文件是自动生成的,使用者不需要知道格式
执行sqlload的脚本也是自动生成
generate_control_file.sh
生成控制文件
generate_execute_shell.sh
生成执行脚本
=============================================
代码说明
load.sh
#!/usr/bin/ksh
################################################################################
?&&é: load.sh
?èê&: &ù?Yò&&&ê&?Y&&&ò±í?&à&×°??&?ó&&?ê&?Y???&
2?ê& 1 = ó?&§?&/?ü?&[@ê&à&?&]
2?ê& 2 = ±í?&(&é?&
×÷?& Bing He
DT&?????
è??ú DT&?è? DT&??èê&
09/23/2003 Bing He &&ê?±àD&
################################################################################
lv_temp1="wk.test1"
f_get_tables()
{
rm -f ${lv_temp1}
sqlplus ${userid} <
/dev/null
set colsep $sep;
set echo off;
set feedback off;
set heading off;
set pagesize 0;
set linesize 1000;
set numwidth 12;
set termout off;
set trimout on;
set trimspool on;
spool ${lv_temp1};
select table_name from user_tables;
spool off;
exit
!
if [ "$?" -ne 0 ]
then
echo "Error:sqlplus ${userid} error in load for ${userid} !"
echo "please check userid and passwd or oracle_sid."
exit
fi
if [ -f ${lv_temp1} ]
then
lv_tables=cat ${lv_temp1} |grep -v "^SQL>" | tr -d ' '
else
echo "Error:${lv_temp1} file not found!"
exit
fi
rm -f ${lv_temp1}
}
################################################################################
?÷3ìDòè&&ú
lv_no=$#
case ${lv_no} in
1 
userid=$1
f_get_tables;
;;
2 
userid=$1
lv_tables=$2
;;

echo "Usage: $0
1<userid passwd[@connection]=""> <table_name>"
2exit
3;;
4esac
5
6for lv_table in ${lv_tables}
7do
8if [ ! -f ${lv_table}.unl ]
9then
10echo "Error:${lv_table}.unl file not found!"
11else
12generate_control_file.sh ${userid} ${lv_table}
13generate_execute_shell.sh ${userid} ${lv_table}
14sh load_${lv_table}.sh
15rm -f ${lv_table}.ctl
16rm -f load_${lv_table}.sh
17fi
18done
19
20################################################################################
21
22=============================================
23
24unload.sh
25=============================================
26#!/usr/bin/ksh
27################################################################################
28#
29# ?&&é: unload.sh
30#
31# ?èê&: &ù?Yò&&&ê&?Y&&&ò±í?&à&D&??ê&?Y2&éú3é&?ó&&?ê&?Y???&
32#
33# 2?ê& 1 = ó?&§?&/?ü?&[@ê&à&?&]
34# 2?ê& 2 = ±í?&(&é?& 
35#
36# ×÷?& Bing He
37#
38# DT&?????
39# è??ú DT&?è? DT&??èê&
40#
41# 09/23/2003 Bing He &&ê?±àD&
42#
43################################################################################
44
45lv_sep='|' # --·?&&·&&&&éò?DT&?3é×??&?&ò&&?·?&&·&&&è&'|'
46lv_temp1="unload.temp1"
47
48f_get_tables()
49{
50rm -f ${lv_temp1}
51sqlplus ${userid} <<!-- -->/dev/null
52set colsep ${lv_sep};
53set echo off;
54set feedback off;
55set heading off;
56set pagesize 0;
57set linesize 1000;
58set numwidth 12;
59set termout off;
60set trimout on;
61set trimspool on;
62spool ${lv_temp1};
63select table_name from user_tables;
64spool off;
65exit
66!
67if [ "$?" -ne 0 ] ; then
68echo "sqlplus $userid error in get table name <"$?">!!"
69echo "please check userid and passwd or database."
70exit
71fi
72
73if [ -f ${lv_temp1} ]
74then
75lv_tables=`cat ${lv_temp1} |grep -v "^SQL>" | tr -d ' '`
76else
77echo "Error:${lv_temp1} file not found!"
78exit
79fi
80rm -f ${lv_temp1}
81
82}
83
84################################################################
85## ?÷3ìDòè&&ú
86lv_no=$#
87
88case ${lv_no} in
891 
90userid=$1
91f_get_tables;
92;;
932 
94userid=$1
95lv_tables=$2
96;;
97* 
98echo "Usage: $0 <userid passwd[@connection]=""> <table_name>"
99exit
100;;
101esac
102
103################################################################
104
105################################################################
106## ?ⅅ????2ù×÷
107
108for table in ${lv_tables}
109do
110rm -f lv_$table.txt
111sqlplus ${userid} <<!-- -->/dev/null
112set colsep ${lv_sep};
113set echo off;
114set feedback off;
115set heading off;
116set pagesize 0;
117set linesize 1000;
118set numwidth 12;
119set termout off;
120set trimout on;
121set trimspool on;
122spool lv_$table.txt;
123select * from $table;
124spool off;
125!
126if [ "$?" -ne 0 ]
127then
128echo "error:sqlplus $userid error in unload table $table!!"
129echo "please check userid and passwd or database."
130exit
131fi
132
133if [ -f lv_$table.txt ]
134then
135cat lv_$table.txt | grep -v "^SQL>"|sed -e "s/ *$//g"|sed "s/$/\|/g"|sed -e "s/ *\|/\|/g" >${table}.unl
136if [[ `grep "ORA-" $table.unl` = "" ]]; then
137echo "unload table ${table}....\t\t\t\t\t ok"
138else
139cat ${table}.unl
140err="$err ${table}"
141fi
142else
143echo $0 error
144fi
145rm -f lv_$table.txt
146done
147
148################################################################
149
150################################################################
151## ?áê&2ù×÷
152
153if [[ "X$err" = "X" ]];then
154echo "Unload Complete!,Thank you!"
155else
156echo "Unload Table $err error, please check it!"
157fi
158
159################################################################
160
161=============================================
162
163generate_control_file.sh
164=============================================
165#!/usr/bin/ksh
166################################################################################
167#
168# ?&&é: generate_control_file.sh
169#
170# ?èê&: &ù?Yò&&&±í?&éú3é&?±í&?&??????&
171#
172# 2?ê& 1 = ó?&§?&/?ü?&[@ê&à&?&]
173# 2?ê& 2 = ±í?&
174#
175# ×÷?& Bing He
176#
177# DT&?????
178# è??ú DT&?è? DT&??èê&
179#
180# 09/23/2003 Bing He &&ê?±àD&
181#
182################################################################################
183
184################################################################################
185## ?÷3ìDòè&&ú
186
187if [ ! $# -eq 2 ]
188then
189echo "Usage: $0 <userid passwd[@connection]=""> <table_name>"
190exit
191else
192userid=$1
193table=$2
194fi
195
196################################################################################
197
198################################################################################
199## ?ⅅ????2ù×÷
200
201lv_temp="wk_${table}.test"
202lv_temp1="wk_${table}.test1"
203lv_temp2="wk_${table}.test2"
204lv_control="${table}.ctl"
205
206sqlplus ${userid} <<!-- -->/dev/null
207spool ${lv_temp};
208desc ${table}
209spool off;
210exit
211!
212if [ "$?" -ne 0 ]
213then
214echo "Error:sqlplus ${userid} error in generate control file for table ${table} !"
215echo "please check userid and passwd or oracle_sid."
216exit
217fi
218
219if [ -f ${lv_temp} ]
220then
221cat ${lv_temp}|grep -v "^SQL>" |grep -v " Name " |grep -v " -------" |awk '{print $1}' > ${lv_temp1}
222lv_line_num=`cat ${lv_temp1} | wc -l`
223lv_line_num=`expr ${lv_line_num} - 2`
224lv_index=0
225
226rm -f ${lv_temp2}
227for lineinfo in `cat ${lv_temp1}`
228do
229if [ ${lv_index} -eq ${lv_line_num} ]
230then
231echo "${lineinfo}" >> ${lv_temp2}
232else
233echo "${lineinfo}," >> ${lv_temp2}
234lv_index=`expr ${lv_index} + 1`
235fi
236done
237else
238echo "$0 error :not find ${lv_temp} file."
239exit
240fi
241
242lv_str="LOAD DATA INFILE '${table}.unl' BADFILE 'bad_${table}.bad' APPEND INTO TABLE ${table} FIELDS TERMINATEd BY \"|\""
243echo ${lv_str} > ${lv_control}
244echo "(" >> ${lv_control}
245cat ${lv_temp2} >> ${lv_control}
246echo ")" >> ${lv_control}
247
248rm -f ${lv_temp}
249rm -f ${lv_temp1}
250rm -f ${lv_temp2}
251
252################################################################################
253
254=============================================
255
256generate_execute_shell.sh
257=============================================
258#!/usr/bin/ksh
259################################################################################
260#
261# ?&&é: generate_execute_shell.sh
262#
263# ?èê&: &ù?Yò&&&±í?&éú3é&?±í&?×°????±?
264#
265# 2?ê& 1 = ó?&§?&/?ü?&[@ê&à&?&]
266# 2?ê& 2 = ±í?&
267#
268# ×÷?& Bing He
269#
270# DT&?????
271# è??ú DT&?è? DT&??èê&
272#
273# 09/23/2003 Bing He &&ê?±àD&
274#
275################################################################################
276
277################################################################################
278## ?÷3ìDòè&&ú
279
280if [ ! $# -eq 2 ]
281then
282echo "Usage: $0 <userid passwd[@connection]=""> <table_name>"
283exit
284else
285userid=$1
286table=$2
287fi
288
289################################################################################
290
291################################################################################
292## ??2&±&á&&¨ò&?&óò
293
294lv_rows=10000
295lv_bindsize=8192000
296lv_readsize=8192000
297
298################################################################################
299
300################################################################################
301## éú3é?ⅅ??±????&
302
303echo "sqlldr ${userid} control=${table}.ctl rows=${lv_rows} bindsize=${lv_bindsize} readsize=${lv_readsize} log=log_${table}.log bad=bad_${table}.bad direct=true" > load_${table}.sh
304
305################################################################################
306
307=============================================</table_name></userid></table_name></userid></table_name></userid></table_name></userid>