学习随笔(一):Shell脚本批量导入数据到Oracle数据库

判断输入

if [ $# -ne 1 ]; then
    echo $0 DATAFILE
    echo
    exit 2
fi
输入参数不为1显示该信息

处理文本内容

处理文本,利用awk处理文本,如文本的一条数据是:

数据中的分隔符是(char)3分隔符,属于不能打印的分隔符,当然替换成其他简单的打印字符也可以
201508,1000,ADFF1324252,1,1,0,1,1,242.0,2424.0,我最伟大,546.0,6868.0,B9999FA8226,2.3,39.3
query=`echo $line | awk 'BEGIN{FS="\03"}{
                printf("'\''%s'\'','\''%s'\'','\''%s'\'','\''", $1, $2, $3);
                if ($4 == "1") {
                 printf("123456\&'\''\|\|'\''我最伟大\&'\''\|\|'\''%s\|",$9)
                        };
                        if ($5 == "1") {
                 printf("234567\&'\''\|\|'\''我最渺小\&'\''\|\|'\''%s\|",$10)
                        };
                        if ($6 == "1") {
                 printf("345678\&'\''\|\|'\''我最厉害\&'\''\|\|'\''%s\|",$11)
                        };
                        if ($7 == "1") {
                 printf("456789\&'\''\|\|'\''我最牛逼\&'\''\|\|'\''%s\|",$12)
                        };
                        if ($8 == "1") {
                 printf("567890\&'\''\|\|'\''我最无语\&'\''\|\|'\''%s\|",$13)
                        };
                printf("'\'','\''%s'\'','\''%s'\'','\''%s'\''", $14, $15, $16)}'`

    statement=`echo "INSERT INTO $TABLE(MONTH,CODE,ID,INFO,R_ID,TUDE,ITUDE) VALUES($query);"`
    echo $statement >>sql.txt
这里,首先用awk格式化输出特定字符,这里只取1,2,3和45678中不为0的数值,和14,15,16这几个值。
格式化输出之后用query接收,并将其组成sql语句,保存到sql.txt中。
在awk处理过程中,用BEGIN{FS="\03"}来指定分隔符为(char)3分隔符,如果是逗号,可以直接指定FS=","或者利用awk -F ','也可。
在组成insert的sql语句过程中,单引号需要转义,利用'\''进行转义,即单引号、斜杠、单引号、单引号。
地址符号&在插入数据库的过程中会保存,需要用\&'\''\|\|'\'',其中的'都是单引号。构成&'||'这种形式。

连接数据库

连接Oracle数据库当然用用sqlplus
sqlplus test/test@XX.XX.XX.XX:1521/db<<EOF
XX.XX.XX.XX代表远程数据库的ip地址IP。

插入数据

连接完成数据库,直接
@sql.txt  即可插入数据
然后commit;

完整代码

#!/bin/sh
#
# @test.sh
# @文件数据导入oracle
# @version 1.0

TABLE="T_RECO"

if [ $# -ne 1 ]; then
    echo $0 DATAFILE
    echo
    exit 2
fi
data=$1
while  read line;
do
    query=`echo $line | awk 'BEGIN{FS="\03"}{
                printf("'\''%s'\'','\''%s'\'','\''%s'\'','\''", $1, $2, $3);
                if ($4 == "1") {
                 printf("123456\&'\''\|\|'\''我最伟大\&'\''\|\|'\''%s\|",$9)
                        };
                        if ($5 == "1") {
                 printf("234567\&'\''\|\|'\''我最渺小\&'\''\|\|'\''%s\|",$10)
                        };
                        if ($6 == "1") {
                 printf("345678\&'\''\|\|'\''我最厉害\&'\''\|\|'\''%s\|",$11)
                        };
                        if ($7 == "1") {
                 printf("456789\&'\''\|\|'\''我最牛逼\&'\''\|\|'\''%s\|",$12)
                        };
                        if ($8 == "1") {
                 printf("567890\&'\''\|\|'\''我最无语\&'\''\|\|'\''%s\|",$13)
                        };
                printf("'\'','\''%s'\'','\''%s'\'','\''%s'\''", $14, $15, $16)}'`

    statement=`echo "INSERT INTO $TABLE(MONTH,CODE,ID,INFO,R_ID,TUDE,ITUDE) VALUES($query);"`
    echo $statement >>sql.txt
done < $data
sqlplus test/test@XX.XX.XX.XX:1521/db<<EOF
@sql.txt
commit; 
exit
EOF
if [[ $? -eq 0 ]]; then
    echo "Wrote data into DB"
fi


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值