shell之接收oracle返回数据方式
1、1:shell连接oracle数据库shell连接数据库有两种方式,一种是传入参数和接收返回值SQL查询结果:SQL> select default_tablespace,temporary_tablespace ,';'from dba_users where username in ('ZXX','SA');DEFAULT_TABLESPACE TEMPORARY_TABLESPACE ';'------------------------------ ------------------------------ ---REMOTE320DB TEMP ;REMOTE320DB TEMP ;shell连接oracle数据:[oracle@rhel6 zxx_shell]$ cat 6-oracle.sh#!/bin/bashSOURCE_DB="zxx/zxx@orclone" SOURCE_DATA= #全局变量source_sql_page="select default_tablespace,temporary_tablespace,';' from dba_users where username in ('ZXX','SA');" #SQL语句,每行之前用";"隔开function getSourceData(){ old_data=`sqlplus -s $SOURCE_DB<<EOF set pagesize 0 heading off echo off termout off feedback off linesize 1200 colsep "," trimspool on trimout on #列之间用,号隔开,linesize很重要 $source_sql_page quit;EOF` #必须顶格写 #delete last char SOURCE_DATA=${old_data%?} #去除字符串最后一个字符}getSourceDataecho $SOURCE_DATA[oracle@rhel6 zxx_shell]$ ./6-oracle.shREMOTE320DB ,TEMP ,; REMOTE320DB ,TEMP ,[oracle@rhel6 zxx_shell]$注意点:1:每列之间隔开符在 set中使用 setcolsep ","2:每行数据之间隔开需要在SQL中使用,';' from,分隔符必须是shell非转义字符和表数据中没有的字符,否则到时候无法分割3:打印长度在set中使用linesize 1200,建议越大越好,否则表字段多了之后截取字符时会导致列变短4:每行数据使用分隔符之后,获取数据之后需要去除最后一个字符5:如果需要连接数据库,EOF必须顶格写,否则报错。



5、5:对于oracle “\"打印到shell之后转义问题处理SQL> select ''''||clgjid||'''',txml from zxx_test where rownum < 3;'100001228857696' jjhikx\2015\03\30\23\3206811188\'100001228857725' jjhikx\2015\03\30\23\3206811188\解决办法:采用字符串拼接方法
6、6:对shell变量接收有限返回值问题处理进行批量处理,比如分页处理
7、7:对于oracle中表中列空字符处理采用nvl2或者nvl函数