oracle 创建存储过程查询历史交易明细 提高查询效率

create or replace package tomorrow as
  type p_cursor is ref Cursor;
end;


create or replace package pro_query_postxnjnl is
  ---办事处,业务员,商户,查询历史交易明细
  procedure query_postxnjnl_his_info(curpage     in varchar2,
                                     unitpage    in varchar2,
                                     stldt       in varchar2,
                                     stldtstr    in varchar2,
                                     stldtend    in varchar2,
                                     txncd       in varchar2,
                                     txnsts      in varchar2,
                                     agtorg      in varchar2,
                                     txnamtstr   in varchar2,
                                     txnamtend   in varchar2,
                                     mercid      in varchar2,
                                     mernam      in varchar2,
                                     srefno      in varchar2,
                                     osrefno     in varchar2,
                                     logno       in varchar2,
                                     ologno      in varchar2,
                                     termid      in varchar2,
                                     flag        in varchar2,
                                     mercid_oper in varchar2,
                                     agentid     in varchar2,
                                     tlrid       in varchar2,
                                     v_cursor    out tomorrow.p_cursor);
  procedure query_postxnjnl_his_count(stldt       in varchar2,
                                      stldtstr    in varchar2,
                                      stldtend    in varchar2,
                                      txncd       in varchar2,
                                      txnsts      in varchar2,
                                      agtorg      in varchar2,
                                      txnamtstr   in varchar2,
                                      txnamtend   in varchar2,
                                      mercid      in varchar2,
                                      mernam      in varchar2,
                                      srefno      in varchar2,
                                      osrefno     in varchar2,
                                      logno       in varchar2,
                                      ologno      in varchar2,
                                      termid      in varchar2,
                                      flag        in varchar2,
                                      mercid_oper in varchar2,
                                      agentid     in varchar2,
                                      tlrid       in varchar2,
                                      v_cursor    out tomorrow.p_cursor);
  procedure query_postxnjnl_his_amttotal(stldt       in varchar2,
                                         stldtstr    in varchar2,
                                         stldtend    in varchar2,
                                         txncd       in varchar2,
                                         txnsts      in varchar2,
                                         agtorg      in varchar2,
                                         txnamtstr   in varchar2,
                                         txnamtend   in varchar2,
                                         mercid      in varchar2,
                                         mernam      in varchar2,
                                         srefno      in varchar2,
                                         osrefno     in varchar2,
                                         logno       in varchar2,
                                         ologno      in varchar2,
                                         termid      in varchar2,
                                         flag        in varchar2,
                                         mercid_oper in varchar2,
                                         agentid     in varchar2,
                                         tlrid       in varchar2,
                                         v_cursor    out tomorrow.p_cursor);

end;


create or replace package body pro_query_postxnjnl is
  ---办事处,业务员,商户,查询历史交易明细
  procedure query_postxnjnl_his_info(curpage     in varchar2,
                                     unitpage    in varchar2,
                                     stldt       in varchar2,
                                     stldtstr    in varchar2,
                                     stldtend    in varchar2,
                                     txncd       in varchar2,
                                     txnsts      in varchar2,
                                     agtorg      in varchar2,
                                     txnamtstr   in varchar2,
                                     txnamtend   in varchar2,
                                     mercid      in varchar2,
                                     mernam      in varchar2,
                                     srefno      in varchar2,
                                     osrefno     in varchar2,
                                     logno       in varchar2,
                                     ologno      in varchar2,
                                     termid      in varchar2,
                                     flag        in varchar2,
                                     mercid_oper in varchar2,
                                     agentid     in varchar2,
                                     tlrid       in varchar2,
                                     v_cursor    out tomorrow.p_cursor) as
 
    startpos            number;
    endpos              number;
    tj                  varchar2(500);
    tj2                 varchar2(100);
    tj3                 varchar2(100);
    sqlstr              varchar2(300);
    query_postxnjnl_his varchar2(3000);
  begin
    tj     := '';
    tj2    := '';
    tj3    := '';
    sqlstr := '';
    --商户号
    if (mercid is not null) then
      tj := tj || ' AND I.MERCNUM LIKE ' || '''' || '%' || mercid || '%' || '''';
    end if;
    --商户名称
    if (mernam is not null) then
      tj := tj || ' AND I.MERNAM LIKE ' || '''' || '%' || mernam || '%' || '''';
    end if;
    --系统参考号
    if (srefno is not null) then
      tj := tj || ' AND P.SREFNO LIKE ' || '''' || '%' || srefno || '%' || '''';
    end if;
    --原系统参考号
    if (osrefno is not null) then
      tj := tj || ' AND P.TSREFNO LIKE ' || '''' || '%' || osrefno || '%' || '''';
    end if;
    --交易日期
    if (stldt is not null) then
      tj := tj || ' AND P.SYSDAT =''' || stldt || '''';
    end if;
    tj := tj || ' AND P.SYSDAT BETWEEN ''' || stldtstr || ''' AND ''' ||
          stldtend || '''';
    --交易类型
    if (txncd is not null) then
      tj := tj || ' AND P.TXNCD =''' || txncd || '''';
    end if;
    --交易状态
    if (txnsts is not null) then
      tj := tj || ' AND P.TXNSTS =''' || txnsts || '''';
    end if;
    --合作机构
    if (agtorg is not null) then
      tj := tj || ' AND P.AGTORG =''' || agtorg || '''';
    end if;
    --交易金额起
    if (txnamtstr is not null) then
      tj := tj || ' AND TO_NUMBER(P.TXNAMT)>=TO_NUMBER(''' || txnamtstr || '''' ||
            ')*100';
    end if;
    --交易金额终
    if (txnamtend is not null) then
      tj := tj || ' AND TO_NUMBER(P.TXNAMT)<=TO_NUMBER(''' || txnamtend || '''' ||
            ')*100';
    end if;
    --原交易流水号和交易流水号
    if ((logno is null) and (ologno is not null)) then
      sqlstr := sqlstr || ' AND (P.LOGNO LIKE ' || '''' || '%' || ologno || '%' || '''' ||
                'OR P.OLOGNO LIKE ' || '''' || '%' || ologno || '%' ||
                ''')';
    end if;
    if ((logno is not null) and (ologno is null)) then
      sqlstr := sqlstr || ' AND P.LOGNO LIKE ' || '''' || '%' || logno || '%' || '''';
    end if;
    if ((logno is not null) and (ologno is not null)) then
      sqlstr := sqlstr || ' AND P.LOGNO LIKE ' || '''' || '%' || logno || '%' || '''' ||
                'AND P.OLOGNO LIKE ' || '''' || '%' || ologno || '%' || '''';
    end if;
    --终端号
    if (termid is not null) then
      sqlstr := sqlstr || ' AND P.TERMID LIKE ' || '''' || '%' || termid || '%' || '''';
    end if;
    --分页计算
    if ((curpage is not null) and (unitpage is not null)) then
      startpos := (curpage - 1) * unitpage + 1;
      endpos   := curpage * unitpage;
    end if;
    --判断不同角色登录查询历史交易明细
    if (flag = '2') then
      --商户角色
      if (mercid_oper is not null) then
        tj := tj || ' AND I.MERCNUM LIKE ' || '''' || '%' || mercid_oper || '%' || '''';
      end if;
    end if;
    if (flag = '3') then
      --办事处角色
      if (agentid is not null) then
        tj2 := tj2 || ' WHERE MI.AGENTID=''' || agentid || '''';
        tj3 := tj3 || ' WHERE MD.AGENTID=''' || agentid || '''';
      end if;
    end if;
    if (flag = '1') then
      --业务员角色     通过办事处编号和当前操作员id查找 
      if (tlrid is not null) then
        tj2 := tj2 || ' WHERE MI.OPERID =''' || tlrid ||
               ''' OR MI.AGENTID IN (SELECT AGENTID FROM POSAGTINF WHERE TLRID=''' ||
               tlrid || ''')';
        tj3 := tj3 || ' WHERE MD.OPERID=''' || tlrid ||
               ''' OR MD.AGENTID IN (SELECT AGENTID FROM POSAGTINF WHERE TLRID=''' ||
               tlrid || ''')';
      end if;
    end if;
 
    --查询历史交易明细sql
    query_postxnjnl_his := 'SELECT DISTINCT I.MERNAM,I.MERCID,I.MERCNUM,B.BRANAM,T.TERMID,P.SYSDAT,P.TXNTM,P.LOGNO,P.TXNTYP,
        P.CRDNO,P.TXNAMT,P.SREFNO,P.OLOGNO,P.TSREFNO OTSREFNO,P.TXNSTS,P.CRDFLG,P.TXNCD,U.ISSNAM,N.ORGNAM,P.FEE,(P.TXNAMT-DECODE(TRIM(P.FEE),' || '''''' || ',0,P.FEE)) JSAMT
        FROM POSTXNJNLHIS P INNER JOIN
        (SELECT TRIM(MI.MERNAM) MERNAM,TRIM(MI.MERCID) MERCID,TRIM(MI.MERCNUM) MERCNUM FROM POSMERCINF MI ' || tj2 || ' union
         SELECT  DISTINCT TRIM(MD.MERNAM) MERNAM,TRIM(MD.MERCID) MERCID,TRIM(MD.MERCNUM) MERCNUM FROM POSMERCINFMOD MD ' || tj3 || '
        )I ON P.MERCID=I.MERCID
        INNER JOIN POSTERMINF T ON P.TERMID=T.TERMID LEFT JOIN POSBRAINF B ON TRIM(T.BRAID)=TRIM(B.BRAID)
        LEFT JOIN  UNIONFITNAME U ON TRIM(P.ISSINO)=TRIM(U.ISSNO)
        LEFT JOIN POSNODINF N ON P.AGTORG=N.AGTORG
        WHERE P.TXNTYP!=''C'' ' || sqlstr || '  ' || tj || '
        ORDER BY P.SYSDAT DESC,P.TXNTM DESC,I.MERCID  DESC';
    query_postxnjnl_his := 'select  * from (select  B.*,rownum rid from (' || query_postxnjnl_his || ')B where rownum<=' || endpos || ')A where A.rid>=' || startpos;
    open v_cursor for query_postxnjnl_his;
  Exception
    when others then
      dbms_output.put_line('数据库出现异常!');
      raise;
  end query_postxnjnl_his_info;
  --统计总个数
  procedure query_postxnjnl_his_count(stldt       in varchar2,
                                      stldtstr    in varchar2,
                                      stldtend    in varchar2,
                                      txncd       in varchar2,
                                      txnsts      in varchar2,
                                      agtorg      in varchar2,
                                      txnamtstr   in varchar2,
                                      txnamtend   in varchar2,
                                      mercid      in varchar2,
                                      mernam      in varchar2,
                                      srefno      in varchar2,
                                      osrefno     in varchar2,
                                      logno       in varchar2,
                                      ologno      in varchar2,
                                      termid      in varchar2,
                                      flag        in varchar2,
                                      mercid_oper in varchar2,
                                      agentid     in varchar2,
                                      tlrid       in varchar2,
                                      v_cursor    out tomorrow.p_cursor) as
 
    tj                    varchar2(500);
    tj2                   varchar2(100);
    tj3                   varchar2(100);
    sqlstr                varchar2(300);
    query_postxnjnl_count varchar2(3000);
  begin
    tj     := '';
    tj2    := '';
    tj3    := '';
    sqlstr := '';
    --商户号
    if (mercid is not null) then
      tj := tj || ' AND I.MERCNUM LIKE ' || '''' || '%' || mercid || '%' || '''';
    end if;
    --商户名称
    if (mernam is not null) then
      tj := tj || ' AND I.MERNAM LIKE ' || '''' || '%' || mernam || '%' || '''';
    end if;
    --系统参考号
    if (srefno is not null) then
      tj := tj || ' AND P.SREFNO LIKE ' || '''' || '%' || srefno || '%' || '''';
    end if;
    --原系统参考号
    if (osrefno is not null) then
      tj := tj || ' AND P.TSREFNO LIKE ' || '''' || '%' || osrefno || '%' || '''';
    end if;
    --交易日期
    if (stldt is not null) then
      tj := tj || ' AND P.SYSDAT =''' || stldt || '''';
    end if;
    tj := tj || ' AND P.SYSDAT BETWEEN ''' || stldtstr || ''' AND ''' ||
          stldtend || '''';
    --交易类型
    if (txncd is not null) then
      tj := tj || ' AND P.TXNCD =''' || txncd || '''';
    end if;
    --交易状态
    if (txnsts is not null) then
      tj := tj || ' AND P.TXNSTS =''' || txnsts || '''';
    end if;
    --合作机构
    if (agtorg is not null) then
      tj := tj || ' AND P.AGTORG =''' || agtorg || '''';
    end if;
    --交易金额起
    if (txnamtstr is not null) then
      tj := tj || ' AND TO_NUMBER(P.TXNAMT)>=TO_NUMBER(''' || txnamtstr || '''' ||
            ')*100';
    end if;
    --交易金额终
    if (txnamtend is not null) then
      tj := tj || ' AND TO_NUMBER(P.TXNAMT)<=TO_NUMBER(''' || txnamtend || '''' ||
            ')*100';
    end if;
    --原交易流水号和交易流水号
    if ((logno is null) and (ologno is not null)) then
      sqlstr := sqlstr || ' AND (P.LOGNO LIKE ' || '''' || '%' || ologno || '%' || '''' ||
                'OR P.OLOGNO LIKE ' || '''' || '%' || ologno || '%' ||
                ''')';
    end if;
    if ((logno is not null) and (ologno is null)) then
      sqlstr := sqlstr || ' AND P.LOGNO LIKE ' || '''' || '%' || logno || '%' || '''';
    end if;
    if ((logno is not null) and (ologno is not null)) then
      sqlstr := sqlstr || ' AND P.LOGNO LIKE ' || '''' || '%' || logno || '%' || '''' ||
                'AND P.OLOGNO LIKE ' || '''' || '%' || ologno || '%' || '''';
    end if;
    --终端号
    if (termid is not null) then
      sqlstr := sqlstr || ' AND P.TERMID LIKE ' || '''' || '%' || termid || '%' || '''';
    end if;
    --判断不同角色登录查询历史交易明细
    if (flag = '2') then
      --商户角色
      if (mercid_oper is not null) then
        tj := tj || ' AND I.MERCNUM LIKE ' || '''' || '%' || mercid_oper || '%' || '''';
      end if;
    end if;
    if (flag = '3') then
      --办事处角色
      if (agentid is not null) then
        tj2 := tj2 || ' WHERE MI.AGENTID=''' || agentid || '''';
        tj3 := tj3 || ' WHERE MD.AGENTID=''' || agentid || '''';
      end if;
    end if;
    if (flag = '1') then
      --业务员角色     通过办事处编号和当前操作员id查找 
      if (tlrid is not null) then
        tj2 := tj2 || ' WHERE MI.OPERID =''' || tlrid ||
               ''' OR MI.AGENTID IN (SELECT AGENTID FROM POSAGTINF WHERE TLRID=''' ||
               tlrid || ''')';
        tj3 := tj3 || ' WHERE MD.OPERID=''' || tlrid ||
               ''' OR MD.AGENTID IN (SELECT AGENTID FROM POSAGTINF WHERE TLRID=''' ||
               tlrid || ''')';
      end if;
    end if;

    --查询历史交易明细sql
    query_postxnjnl_count := 'SELECT P.LOGNO
        FROM POSTXNJNLHIS P INNER JOIN
        (SELECT TRIM(MI.MERNAM) MERNAM,TRIM(MI.MERCID) MERCID,TRIM(MI.MERCNUM) MERCNUM FROM POSMERCINF MI ' || tj2 || ' union
         SELECT  DISTINCT TRIM(MD.MERNAM) MERNAM,TRIM(MD.MERCID) MERCID,TRIM(MD.MERCNUM) MERCNUM FROM POSMERCINFMOD MD ' || tj3 || '
        )I ON P.MERCID=I.MERCID WHERE P.TXNTYP!=''C'' ' || sqlstr || '  ' || tj || '';
    query_postxnjnl_count := 'SELECT COUNT(1) AS TOLCNT FROM (' || query_postxnjnl_count || ')';
    open v_cursor for query_postxnjnl_count;
  Exception
    when others then
      dbms_output.put_line('数据库出现异常!');
      raise;
  end query_postxnjnl_his_count;
  --统计交易总金额
  procedure query_postxnjnl_his_amttotal(stldt       in varchar2,
                                         stldtstr    in varchar2,
                                         stldtend    in varchar2,
                                         txncd       in varchar2,
                                         txnsts      in varchar2,
                                         agtorg      in varchar2,
                                         txnamtstr   in varchar2,
                                         txnamtend   in varchar2,
                                         mercid      in varchar2,
                                         mernam      in varchar2,
                                         srefno      in varchar2,
                                         osrefno     in varchar2,
                                         logno       in varchar2,
                                         ologno      in varchar2,
                                         termid      in varchar2,
                                         flag        in varchar2,
                                         mercid_oper in varchar2,
                                         agentid     in varchar2,
                                         tlrid       in varchar2,
                                         v_cursor    out tomorrow.p_cursor) as
 
    tj                       varchar2(500);
    tj2                      varchar2(100);
    tj3                      varchar2(100);
    sqlstr                   varchar2(300);
    query_postxnjnl_amttotal varchar2(3000);
  begin
    tj     := '';
    tj2    := '';
    tj3    := '';
    sqlstr := '';
    --商户号
    if (mercid is not null) then
      tj := tj || ' AND I.MERCNUM LIKE ' || '''' || '%' || mercid || '%' || '''';
    end if;
    --商户名称
    if (mernam is not null) then
      tj := tj || ' AND I.MERNAM LIKE ' || '''' || '%' || mernam || '%' || '''';
    end if;
    --系统参考号
    if (srefno is not null) then
      tj := tj || ' AND P.SREFNO LIKE ' || '''' || '%' || srefno || '%' || '''';
    end if;
    --原系统参考号
    if (osrefno is not null) then
      tj := tj || ' AND P.TSREFNO LIKE ' || '''' || '%' || osrefno || '%' || '''';
    end if;
    --交易日期
    if (stldt is not null) then
      tj := tj || ' AND P.SYSDAT =''' || stldt || '''';
    end if;
    tj := tj || ' AND P.SYSDAT BETWEEN ''' || stldtstr || ''' AND ''' ||
          stldtend || '''';
    --交易类型
    if (txncd is not null) then
      tj := tj || ' AND P.TXNCD =''' || txncd || '''';
    end if;
    --交易状态
    if (txnsts is not null) then
      tj := tj || ' AND P.TXNSTS =''' || txnsts || '''';
    end if;
    --合作机构
    if (agtorg is not null) then
      tj := tj || ' AND P.AGTORG =''' || agtorg || '''';
    end if;
    --交易金额起
    if (txnamtstr is not null) then
      tj := tj || ' AND TO_NUMBER(P.TXNAMT)>=TO_NUMBER(''' || txnamtstr || '''' ||
            ')*100';
    end if;
    --交易金额终
    if (txnamtend is not null) then
      tj := tj || ' AND TO_NUMBER(P.TXNAMT)<=TO_NUMBER(''' || txnamtend || '''' ||
            ')*100';
    end if;
    --原交易流水号和交易流水号
    if ((logno is null) and (ologno is not null)) then
      sqlstr := sqlstr || ' AND (P.LOGNO LIKE ' || '''' || '%' || ologno || '%' || '''' ||
                'OR P.OLOGNO LIKE ' || '''' || '%' || ologno || '%' ||
                ''')';
    end if;
    if ((logno is not null) and (ologno is null)) then
      sqlstr := sqlstr || ' AND P.LOGNO LIKE ' || '''' || '%' || logno || '%' || '''';
    end if;
    if ((logno is not null) and (ologno is not null)) then
      sqlstr := sqlstr || ' AND P.LOGNO LIKE ' || '''' || '%' || logno || '%' || '''' ||
                'AND P.OLOGNO LIKE ' || '''' || '%' || ologno || '%' || '''';
    end if;
    --终端号
    if (termid is not null) then
      sqlstr := sqlstr || ' AND P.TERMID LIKE ' || '''' || '%' || termid || '%' || '''';
    end if;
    --判断不同角色登录查询历史交易明细
    if (flag = '2') then
      --商户角色
      if (mercid_oper is not null) then
        tj := tj || ' AND I.MERCNUM LIKE ' || '''' || '%' || mercid_oper || '%' || '''';
      end if;
    end if;
    if (flag = '3') then
      --办事处角色
      if (agentid is not null) then
        tj2 := tj2 || ' WHERE MI.AGENTID=''' || agentid || '''';
        tj3 := tj3 || ' WHERE MD.AGENTID=''' || agentid || '''';
      end if;
    end if;
    if (flag = '1') then
      --业务员角色     通过办事处编号和当前操作员id查找 
      if (tlrid is not null) then
        tj2 := tj2 || ' WHERE MI.OPERID =''' || tlrid ||
               ''' OR MI.AGENTID IN (SELECT AGENTID FROM POSAGTINF WHERE TLRID=''' ||
               tlrid || ''')';
        tj3 := tj3 || ' WHERE MD.OPERID=''' || tlrid ||
               ''' OR MD.AGENTID IN (SELECT AGENTID FROM POSAGTINF WHERE TLRID=''' ||
               tlrid || ''')';
      end if;
    end if;
 
    --查询历史交易明细sql
    query_postxnjnl_amttotal := 'SELECT (  SUM (xftxnamt) + SUM (ysqwctxnamt) - SUM (thtxnamt))
        AS sumtoal FROM (  SELECT TXNCD, SUM (DECODE (TRIM (TXNCD), 0200000000, TXNAMT, 0))AS XFTXNAMT,
        SUM (DECODE (TRIM (TXNCD),0200200000, TXNAMT, 0))AS XFCXTXNAMT,SUM (DECODE (TRIM (TXNCD),0220200000, TXNAMT, 0))AS thtxnamt,
        SUM (DECODE (TRIM (TXNCD),0200010000, TXNAMT, 0))AS YSQWCTXNAMT,SUM (DECODE (TRIM (TXNCD), 0200210000, TXNAMT, 0))AS YSQCXTXNAMT
        FROM (SELECT TXNCD, SUM (TXNAMT) AS TXNAMT FROM POSTXNJNLHIS P INNER JOIN
        (SELECT TRIM(MI.MERNAM) MERNAM,TRIM(MI.MERCID) MERCID,TRIM(MI.MERCNUM) MERCNUM FROM POSMERCINF MI ' || tj2 || ' UNION
         SELECT  DISTINCT TRIM(MD.MERNAM) MERNAM,TRIM(MD.MERCID) MERCID,TRIM(MD.MERCNUM) MERCNUM FROM POSMERCINFMOD MD ' || tj3 || '
        )I ON P.MERCID=I.MERCID INNER JOIN POSTERMINF T ON P.TERMID=T.TERMID LEFT JOIN POSBRAINF B ON TRIM(T.BRAID)=(B.BRAID)
        WHERE  P.TXNSTS  = ''S'' ' || sqlstr || '  ' || tj ||
                                ' GROUP BY TXNCD, txnsts ) GROUP BY TXNCD)';
    open v_cursor for query_postxnjnl_amttotal;
  Exception
    when others then
      dbms_output.put_line('数据库出现异常!');
      raise;
  end query_postxnjnl_his_amttotal;
end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值