首页 > 代码库 > Unix Shell_Oracle Erp和其他系统Interface资料传输通过Shell进行控制(案例)(架构)

Unix Shell_Oracle Erp和其他系统Interface资料传输通过Shell进行控制(案例)(架构)

2014-06-26 BaoXinjian

一、摘要


当不同的系统资料进行交换,可以很多种方式,如MQ,DBLink

当接触一些信息安全比较严的项目,很多公司都是采用unix shell直接进行抛转文件的方式进行

使用unix shell抛传文件的时,就必须区分哪些文件已被读取,哪些文件未被读取,读取成功之后文件如何处理,读取失败后的文件如何处理

 

之前做的一个保险项目,其处理不同系统之间所有的interface data资料,都是通过unix shell去控制,其安全性会比较高

Step1. 通过一个unix shell去读取一个文件夹interface下所有的文件名,

Step2. 将其插入到一个contorl table中,插入之前先判断该文件名是否存在,如果存在就不再插入,避免重复记录

Step3. 通过utl_file读取contorl table中未被处理的data file

Step4. 读取文件成功后,将该文件transfer到另一个文件夹success

Step5. 读取文件失败后,将该文件transfer到另一个文件夹failed

 

二、案例实现


案例:从另外系统抛传interface dat files资料,并存放在/home/applvis/bts/interface中,通过unix shell去控制文件读取

Step1. 建立control table,用以测试unix shell将未读取的文件名存放至该表中

 1 create table bxj_interface_control_tb( 2 batch_id number, 3 file_seq number, 4 file_name varchar2(240), 5 record_count number, 6 success_record number, 7 failure_record number, 8 process_status varchar2(50), 9 request_id number,10 user_id number,11 user_name varchar2(240),12 creation_date date13 )14 15 create sequence bxj_batch_id_sq start with 1000

 

Step2. 确认存放interface dat资料文件夹下有5个文件,所以当unix shell处理后,这个5个文件必须存放至contorl表中

Step3. 确认存在的三个interface存放dat资料、log存放Shell运行的日志、sql存放SQL执行文件

Step4. 最关键的一步,建立Unix Shell,本人不是DBA出生,虽然学过Bash语法,但是不省精通,大家凑活着看

 1 #/bin/bash   2 # +--------------------------------------------+   3 # + An example of calling host concurrent      +    4 # + Author: Gavin.Bao                          +                                 5 # +--------------------------------------------+   6 #   7 # ---------------------------------   8 #  Define variable 9 # ---------------------------------10 export ORA_USER_PASS=$111 export ORA_USER_ID=$212 export ORA_LOGIN_NAME=$313 export ORA_REQUEST_ID=$414 15 export FOLDER_PATH="/home/applvis/bts/interface/"16 export INTERFACE_PATH="/home/applvis/bts/interface"17 export SQL_PATH="/home/applvis/bts/sql"18 export LOG_PATH="/home/applvis/bts/log"19 20 # -------------------------------------------21 #  Loop the file name and store it into array22 # -------------------------------------------23 x=0        24 for filename in ${FOLDER_PATH}*;25 do   26   array[$x]=`basename $filename`  27   let "x+=1"28 done29 30 for interface_name in ${array[*]}31 do32   echo $interface_name33 done34 35 # ---------------------------------  36 #  Prepare plsql script  37 # ---------------------------------38 echo "set serveroutput on size 1000000" > $SQL_PATH/bxjinterface.sql  39 echo "set feed off" >> $SQL_PATH/bxjinterface.sql  40 echo "declare" >> $SQL_PATH/bxjinterface.sql41 echo "  n_count number;" >> $SQL_PATH/bxjinterface.sql42 echo "  n_batch_id number := &1;" >> $SQL_PATH/bxjinterface.sql43 echo "  v_file_name varchar2(240) := ‘&2‘;" >> $SQL_PATH/bxjinterface.sql44 echo "begin" >> $SQL_PATH/bxjinterface.sql  45 echo "  select count(*) into n_count " >> $SQL_PATH/bxjinterface.sql  46 echo "    from bxj_interface_control_tb where file_name = v_file_name;" >> $SQL_PATH/bxjinterface.sql  47 echo "  if (n_count = 0) then" >> $SQL_PATH/bxjinterface.sql48 echo "    insert into bxj_interface_control_tb " >> $SQL_PATH/bxjinterface.sql  49 echo "    values (bxj_batch_id_sq.nextval,n_batch_id,v_file_name,0,0,0,‘N‘,$ORA_REQUEST_ID,$ORA_USER_ID,‘$ORA_LOGIN_NAME‘,sysdate);" >>$SQL_PATH/bxjinterface.sql50 echo "  end if;" >>$SQL_PATH/bxjinterface.sql51 echo "  commit;" >>$SQL_PATH/bxjinterface.sql52 echo "  dbms_output.put_line(‘Excuted Sucessfully.‘);" >> $SQL_PATH/bxjinterface.sql  53 echo "exception when others then" >> $SQL_PATH/bxjinterface.sql  54 echo "  rollback;" >> $SQL_PATH/bxjinterface.sql  55 echo "  dbms_output.put_line(‘Executed Failed‘);" >> $SQL_PATH/bxjinterface.sql  56 echo "  dbms_output.put_line(‘SQLCODE=‘||SQLCODE);" >> $SQL_PATH/bxjinterface.sql  57 echo "  dbms_output.put_line(‘SQLERRM=‘||SQLERRM);" >> $SQL_PATH/bxjinterface.sql  58 echo "end;" >> $SQL_PATH/bxjinterface.sql  59 echo "/" >> $SQL_PATH/bxjinterface.sql60 61 # -------------------------------------------  62 #  Execute plsql script and generate the log63 # -------------------------------------------  64 if [ -s $SQL_PATH/bxjinterface.sql ]; then65   echo -e "Running SQL script to find out bdump directory... \n"   66   length=${#array[@]}67   echo $length68   for((i=0;i<$length;i++))69   do70     $ORACLE_HOME/bin/sqlplus -s apps/apps >> $LOG_PATH/bxjinterface.log << EOF  71     @$SQL_PATH/bxjinterface.sql $i ${array[$i]}72 EOF73 done74 fi75 76 # --------------------------------  77 #  show log file78 # --------------------------------  79 echo "Check the reslut "80 echo "------------------------"81 cat $LOG_PATH/bxjinterface.log82 83 echo "bxj shell end"

 

三、案例测试


Test1. 调用建立的Shell文件,读取文件名

 Test2. Unix Shell执行时,产生的Log文件

Test2. Unix Shell执行时,产生的SQL文件

Test3. 查看Contorl table中是否存在5个文件名

 

********************作者:鲍新建********************