设为首页 加入收藏

TOP

记一次bash脚本开发的经历(一)
2019-09-03 00:38:53 】 浏览:54
Tags:一次 bash 脚本 开发 经历

现状描述与需求描述

最近梳理系统功能的时候发现现在每个月处理完数据之后,需要给别的系统传送批接口文件,接口文件的内容是来自于Oracle数据表中的数据。我每次都需要手工执行一下存储过程,让数据从正式表中插入到接口表中,然后再借助plsql工具软件sqlplus的spool工具导出接口文件,然后把导出来的7个接口文件,打成zip压缩包,再通过前台系统实现上传(这一部分功能之前已经在前台系统实现部署上线了,详细可参见博文:https://www.cnblogs.com/zhongfengshan/p/9454259.html)。但是现在每个月都需要做这样的事情,很繁琐,而且每个月都需要耗费我的精力,程序猿的个性喜欢探索、创造、和解决问题,本着这样的态度,我开始了这件事的优化之旅。

方案分析

针对于此需求,大概有两种方案。

方案一:把这一系列的操作都写在Java后台的业务逻辑当中,然后通过前台系统每月传参数过去,实现调用。

方案二:可以用shell脚本实现存储过程的调用和数据接口文件的导出和压缩。

由于系统是一个老系统,各种技术框架个分层并没有那么明显,而且有7个文件之多,用Java写起来无论是业务逻辑还是代码量都是及其多,而且不方便测试和调试。相比之下,用shell脚本写,逻辑变得清晰明了,导出的接口文件写在sql文件中,用sqlplus去执行它便可。因此我选用了方案二。

开始实现

第一步:细化业务逻辑,第一步就是需要去调用一个存储过程,存储过程的主要作用是把正式表中当月的数据插入到接口表中。这一步很简单,代码如下

sqlplus zh/dbpassword@zh10g << sql
declare
    imonth varchar2(6);
    strrtn varchar2(8);
    countnum NUMBER;
    begin   
  select to_char(add_months(sysdate,-1),'YYYYMM') into imonth from dual;
  SELECT count(*) INTO countnum FROM t_report_if_carrier 
  WHERE bill_cycle=imonth;
  IF (countnum=0) THEN
    Dbms_Output.put_line(imonth+':'+countnum);
    PR_REPORT_IF(imonth,strrtn);
  END IF;
    end;
      /
sql

计算出当月的上一个月是多少,然后判断表中有没有该月的数据,如果没有,则认为没有执行该存储过程,需要执行存储过程

第二步:需要对导出文件的目录做一下清理,如果上次导出过了,则删除再重新到导出,代码如下:

cd /workforzhongfs/jffile/
rm -rf $report_month
mkdir $report_month
cd $report_month

第三步:把需要执行导出的语句放到一个spoll_file.sql文件中,然后通过sqlplus调用$report_month 代表着需要传给脚本的当前月的上一个月的参数,如现在是2019年04月,则参数为201903

sqlplus zh/dbpassword@zh10g @/workforzhongfs/spoll_file.sql $report_month 

spoll_file.sql的内容如下,其中&1代表$report_month传过来的月份参数。

SET NEWPAGE 0
SET SPACE 0
SET LINESIZE 2500 
SET PAGESIZE 0
SET ECHO OFF
SET FEEDBACK OFF
SET VERIFY OFF
SET HEADING OFF
SET MARKUP HTML OFF SPOOL OFF
SET COLSEP ' '
SET TRIMSPOOL ON
SET TERMOUT OFF
COL report_name FORMAT a35
COL report_name NEW_VALUE rpt_name
select 'CMBFYDWAL06002A'||&1||'0000000.000' as report_name from dual;
SPOOL &rpt_name
select bank_warrant_no || CHR(9)|| rec_pay_date || CHR(9)|| bank_name || CHR(9)||
       record_flag || CHR(9)|| carrier_name || CHR(9)|| carrier_id || CHR(9)||
       descript || CHR(9)|| amount_bill || CHR(9)|| exchange_name2 || CHR(9)||
       rate_bill || CHR(9)|| amount || CHR(9)|| exchange_name || CHR(9)|| rate || CHR(9)||
       amount_rmb || CHR(9)|| bank_fee || CHR(9)|| remark || CHR(9)|| bill_cycle || CHR(9)||
       erp_def_code as data
  from t_report_if_recpay a
 WHERE 1 = 1
 and bill_cycle=&1   order by erp_def_code asc;
SPOOL OFF
select 'CMBFYDWAL06005A'||&1||'0000000.000' as report_name from dual;
SPOOL &rpt_name
select ADVANCE_NO || CHR(9)|| carrier_name || CHR(9)|| WARRANT_NO || CHR(9)||
       REC_DATE || CHR(9)|| EXCHANGE_NAME || CHR(9)|| AMOUNT || CHR(9)||
       AMOUNT_RMB || CHR(9)|| BALANCE || CHR(9)|| BALANCE_RMB as data
  from t_report_if_advance
 WHERE 1 = 1
and bill_cycle=&1   order by erp_def_code asc;
SPOOL OFF
select 'CMBFYDWAL06006A'||&1||'0000000.000' as report_name from dual;
SPOOL &rpt_name
select BAIL_NO || CHR(9)|| carrier_name || CHR(9)|| warrant_no || CHR(9)||
       REC_DATE || CHR(9)|| EXCHANGE_NAME || CHR(9)|| AMOUNT || CHR(9)||
       AMOUNT_RMB || CHR(9)|| BALANCE || CHR(9)|| BALANCE_RMB || CHR(9)||
       bill_cycle || CHR(9)|| erp_def_code as data
  from t_report_if_bail
 WHERE 1 = 1
 and bill_cycle=&1   order by erp_def_code asc;
SPOOL OFF
select 'CMBFYDWAL06007A'||&1||'0000000.000' a
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇linux 学习第十八天学习(DNS分离.. 下一篇阿里云linux服务器打开端口号

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目