Shell_Oracle Erp和其他系统Interface资料传输通过Shell进行控制(案例)
2014-06-26 Created By BaoXinjian
一、摘要
当不同的系统资料进行交换,可以很多种方式,如MQ,DBLink
当接触一些信息安全比较严的项目,很多公司都是采用unix shell直接进行抛转文件的方式进行
使用unix shell抛传文件的时,就必须区分哪些文件已被读取,哪些文件未被读取,读取成功之后文件如何处理,读取失败后的文件如何处理
之前做的一个保险项目,其处理不同系统之间所有的interface data资料,都是通过unix shell去控制,其安全性会比较高
本文只是介绍程式的基本结构,不纠结与语法,真正的控制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 date
13 )
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=$1
11 export ORA_USER_ID=$2
12 export ORA_LOGIN_NAME=$3
13 export ORA_REQUEST_ID=$4
14
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 array
22 # -------------------------------------------
23 x=0
24 for filename in ${FOLDER_PATH}*;
25 do
26 array[$x]=`basename $filename`
27 let "x+=1"
28 done
29
30 for interface_name in ${array[*]}
31 do
32 echo $interface_name
33 done
34
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.sql
41 echo " n_count number;" >> $SQL_PATH/bxjinterface.sql
42 echo " n_batch_id number := &1;" >> $SQL_PATH/bxjinterface.sql
43 echo " v_file_name varchar2(240) := '&2';" >> $SQL_PATH/bxjinterface.sql
44 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.sql
48 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.sql
50 echo " end if;" >>$SQL_PATH/bxjinterface.sql
51 echo " commit;" >>$SQL_PATH/bxjinterface.sql
52 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.sql
60
61 # -------------------------------------------
62 # Execute plsql script and generate the log
63 # -------------------------------------------
64 if [ -s $SQL_PATH/bxjinterface.sql ]; then
65 echo -e "Running SQL script to find out bdump directory... \n"
66 length=${#array[@]}
67 echo $length
68 for((i=0;i<$length;i++))
69 do
70 $ORACLE_HOME/bin/sqlplus -s apps/apps >> $LOG_PATH/bxjinterface.log << EOF
71 @$SQL_PATH/bxjinterface.sql $i '${array[$i]}'
72 EOF
73 done
74 fi
75
76 # --------------------------------
77 # show log file
78 # --------------------------------
79 echo "Check the reslut "
80 echo "------------------------"
81 cat $LOG_PATH/bxjinterface.log
82
83 echo "bxj shell end"
三、案例测试
Test1. 调用建立的Shell文件,读取文件名
Test2. Unix Shell执行时,产生的Log文件
Test2. Unix Shell执行时,产生的SQL文件
Test3. 查看Contorl table中是否存在5个文件名
技术交流,技术讨论,欢迎加入
Technology Blog Created By Oracle ERP - 鲍新建