ORACLE的sqlplus脚本与数据sqlldr处理程序中将数据装在到数据库中的方式一般分为2大类,第一大类是程序中分析出来的数据需要存入数据库。
第二大类是外在数据需要导入到数据库。正对这2大类的我们有不相应的处理办法。
对于第一大类程序中分析出来的数据需要存储到数据库这种情况有2种方式处理:1,使用简单的sql语句追条插入数据库中或使用容器将数据存储之后,循环存入数据库中,
2,将分析的数据写入文件之后,使用sqlldr命令按照控制文件的方式导入数据库中。
对于第二大类外在数据的存储也分为2类:1,使用oracle提供的sqlplus,spool,prompt,expt等命令组成脚本的方式处理。
2,是使用pl/sql工具提供的方法进行处理。
对于第二大类的数据处理方法讲解
一,使用pl/sql工具提供的方法进行处理:
(1)安装好数据库客户端之后配置好PLSQL Developer工具,使用PLSQL Developer工具的tools选项中的import table就可以导入表结构,
当然可以在sql窗口执行sql语句。
(2),就是对已经建立好的数据库和表结构进行导入,同样使用PLSQL Developer工具的tools选项的“导出用户对象”或者export table导出结构。
(3),同上进行批量的导入数据,使用PLSQL Developer工具的tools选项的“导出/导入表”就可以导入或者取出数据库中的数据了。
(4)下面的等待测试:
用PL/SQL DEVELOPER 怎样导出表结构:tools->export tables 是导出表结构,还有数据tools->export user
objects是导出表结构可以用tools->export tables用中间的sql inserts页面,
选中create tables选项,where clause 里写入 where rownum<1
二,使用oracle中sqlplus可以使用的命令spool,prompt,expt等
我们在使用sqlplus命令执行脚本的时候一般需要使用到很多关键字命令,脚本主要就是使用这些组建成的。
组建1,prompt作用是用来输出信息,类似于linux中的echo 命令。例子:prompt ===================
组建2,tarfile 压缩目录及妻子目录。例子:tarfile ${file}将下面的文件压缩。
组建3,fuser 命令列出了使用该设备上任何文件的进程。例子: fuser ${file}
参数:
c 将此文件作为当前目录使用。
e 将此文件作为程序的可执行对象使用。
r 将此文件作为根目录使用。
s 将此文件作为共享库(或其它可装载对象)使用。
组建4,set 关键字结合其他组件
例子:
set head off
set pagesize 0
set linesize 3000
set echo on:显示文件中的每条命令及其执行结果;
set echo off:不显示文件中的命令,只显示其执行结果。
set serveroutput on //SEVEROUTPUT用于控制是否显示存储过程的输出,默认为OFF
SQL> set long 999999
SQL> set feedback off
组建5,term ,time,echo, define 等等
set term on:查询结果既显示于假脱机文件中,又在SQLPLUS中显示;
set term off:查询结果仅仅显示于假脱机文件中
set define off 则关闭该功能,“&”将作为普通字符,如上例,最终字符就为“SQL&Plus”
set define off关闭替代变量功能
set define on 开启替代变量功能
Set echo on/off:打开/关闭命令的回显,默认为ON。
Set time on/off:打开/关闭时间显示,默认为OFF
SHOW linesize pagesize
组建6,spool命令 有很多的作用和选项,spool temp.sql就可以执行sql语句的文件
//下面的spool 命令加文件路径名文件,在执行操作之后使用spool off 命令关闭之后会将spool 开始到spool off 之间的所有信息记录
在指定的文件中,查询结果仅仅存在于假脱机文件中。
SQL> spool /home/qinjiachang/sd_css/src/pay/sock_test/yk/3.txt
SQL>SQL> @/home/qinjiachang/sd_css/src/pay/sock_test/yk/2.sql
11112222333 20130608 20130605147
SQL> spool off
[qinjc@linux203 yk]$ cat 3.txt
SQL> select distinct(region) from OM_MPAY_USER_INFO where region is not null;
0757
0754
SQL>@/home/qinjiachang/sd_css/src/pay/sock_test/yk/2.sql
11112222333 20130608 20130605147
SQL> SPOOL OFF
组建7:EXECUTE(或者EXEC)命令,可以执行单条PL/SQL语句,不需要从缓冲区或脚本文件中执行
脚本例子:
database=test/test001@ubassqlplus -s $database <<EOFa
exec insert_noc_user();
disconnect;
quit;
EOFa
三,可以在shell中使用sqlplus结合sqlldr命令一起操作数据库。
1,例子:
sqlldr ${dblink}\
control=${ctlpath}qfcj.ctl\ 其中\是序行符,表示后面的命令字符串本来都是一行的
log=${logpath}${list}.log\
bad=${badpath}${list}.bad\
data=${listpath}${list}\
direct=faulse errors=100000 readsize=20971520
rm -f ${list}
sqlplus -s ${dblink} << EOFa
insert into push_v4_mon select b.user_id,lower(a.user_name) from push_v4_mon_tmp a,push_v4_userinfo b where a.user_name=b.user_name;
commit;
insert into push_v4_userrelation select user_id,user_name,${groupid1} from push_v4_mon;
commit;
disconnect;
quit;
EOFa
2,可以再shell脚本中的BEGIN与end关键字与sqlplus结合使用
函数的例子:
update()
{
sqlplus -s ${dbcfg} << EOFa | tee -a ./count_log.txt
BEGIN
INSERT INTO table_name VALUES( $1,'$2','$webpath$3',0,sysdate);
COMMIT;
END;
/
disconnect;
quit;
EOFa
}
四,sqlplus命令的使用。
概述,sqlplus命令是连接shell或者程序与数据库之间的桥梁,是一种交互式方式,是oracle自带工具,sqlplus命令提供交互式连接之后同时
可以使用很多的组件,例如set ,spool,time等等共同完成脚本,同时sqlplus还支持手动操作导入数据,导出数据,执行文件等功能。
sqlplus模式是一个大的范围,某些命令或者关键字是oracle环境变量决定的。
(1)sqlplus -s 中的-s表示关闭系统交互的提示信息。
登陆实力方式: sqlplus 用户名/密码@实例名
1. 执行一个SQL脚本文件
SQL>start file_name
SQL>@ file_name
我们可以将多条sql语句保存在一个文本文件中,这样当要执行这个文件中的所有的sql语句时,用上面的任一命令即可,这类似于dos中的批处理。
2. 对当前的输入进行编辑
SQL>edit
3. 重新运行上一次运行的sql语句
SQL>/
4. 将显示的内容输出到指定文件
SQL> SPOOL file_name
在屏幕上的所有内容都包含在该文件中,包括你输入的sql语句。
5. 关闭spool输出
SQL> SPOOL OFF
只有关闭spool输出,才会在输出文件中看到输出的内容。
6.显示一个表的结构
SQL> desc table_name
7. COL命令:
主要格式化列的显示形式。
该命令有许多选项,具体如下:
COL[UMN] [{ column|expr} [ option ...]]
Option选项可以是如下的子句:
ALI[AS] alias
CLE[AR]
FOLD_A[FTER]
FOLD_B[EFORE]
FOR[MAT] format
HEA[DING] text
JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
LIKE { expr|alias}
NEWL[INE]
NEW_V[ALUE] variable
NOPRI[NT]|PRI[NT]
NUL[L] text
OLD_V[ALUE] variable
ON|OFF
WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED] SQL>start /path/insertdata.sql
SQL>@/path/insertdata.sql 这2条都可以在数据库中执行sql语句的脚本,脚本中都是sql语句
SQL>@@insertdata.sql //不指定sql标本的路径,默认情况下是在oracle的当前路径下执行的
SQL>edit 对当前的输入进行编辑 不知道编辑的是不是sql语句的脚本文件
SQL>/ //重新显示上一次运行的sql语句的信息,而不是执行一次sql脚本文件
sqlplus操作数据库脚本举例#!/bin/sh
dblink=user/pwd@dbnameyday=`perl -e '($a,$b,$c,$day,$mon,$year,$d,$e,$f) = localtime(time-86400*2);printf "Mdd",$year+1900,$mon+1,$day'`
#获取区号
ret=`sqlplus -s ${dblink} <<EOF //域的分割标志
set heading off //不显示查询结果的标题字段
set feedback off //不显示查询结构的尾部统计字段
select distinct(region) from OM_MPAY_USER_INFO where region is not null;
disconnect; //断开连接但是不退出sqlplus界面
quit; //退出sqlplus界面
EOF` //表示遇到这个EOF就结束在sqlplus中输入内容
oraerr=`echo ${ret} | grep ERROR`
if [ "A"${oraerr} != "A" ] //蓝色部分为自定义的判断错误标志标签
then
echo "get region error!!!"
else
echo "get region ok"
fi
echo "ret=${ret}"#循环处理区号
for region in ${ret}
do
echo ${region}
ret1=`sqlplus -s ${dblink} <<EOF
set heading off
set feedback off
select B.paycode || '|' ||B.payplattype|| '|' ||B. msisdn|| '|' ||to_char(B.paytime,'YYYY-MM-DD HH24:MI:SS')|| '|' ||
B.payamount || '|' ||B.Paychannel|| '|' from OM_MPAY_USER_INFO A , OM_MPAY B
WHERE A.msisdn = B.msisdn and A.region= ${region} and B.pay_date = ${yday};
disconnect;
quit;
EOF`
# 符号|| 表示将字段结果拼在一起输出
oraerr=`echo ${ret1} | grep ERROR`
if [ "A"${oraerr} != "A" ];then
echo "get region error!!!"
else
echo " ok"
fi
echo "ret1=${ret1}"
done
结果如下
ret=
0758
9105
ret1=
20130605147|1|13012345678|2013-06-08 10:09:43|50|2|
20130605147|1|13012345678|2013-06-08 10:09:43|50|2|