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|