有个转账流水表TRAN_FLOW,字段:FLOW_NO,CLIENT_NO(客户号),PAY_ACCOUT,PAY_ACCOUNT_NAME(客户姓名),RECEIVE_ACCOUNT(接受账号),TRAN_DATE(日期),AMOUNT(金额),STATUS(状态)
STATUS为90时成功,91时为失败。A、输入:统计起始日期(必输),统计截止日期(笔数),客户号(可空),客户姓名(可空);
B、输出:客户号、转账成功总笔数、转账失败总笔数、转账成功总金额、转账失败总金额、转账总笔数、转账总金额
自己写了包头,下面不会写了,求高手帮助下。
PROCEDURE PROC_STATIS_TRANSFER
  (
    IN_BEGINDATE     in    VARCHAR2,
    IN_ENDDATE       in    VARCHAR2,
    IN_CLIENTNO IN   VARCHAR2,
    IN_CLIENTNAME IN   VARCHAR2,
    OUT_RETCODE        OUT   VARCHAR2,
    OUT_RESULT         OUT   REF_CURSOR
  );

解决方案 »

  1.   


    CREATE OR REPLACE PROCEDURE PROC_STATIS_TRANSFER
    (
      IN_BEGINDATE in VARCHAR2,
      IN_ENDDATE in VARCHAR2,
      IN_CLIENTNO IN VARCHAR2,
      IN_CLIENTNAME IN VARCHAR2,
      OUT_RETCODE OUT VARCHAR2,
      OUT_RESULT OUT REF_CURSOR
      )
    IS
    SUM_CNUMBER;--转账成功总笔数
    SUN_SNUMBER;--转账失败总笔数
    SUM_CAMOUT;--转账成功总金额
    SUM_SAMOUT;--转账失败总金额
    SUM_SUMNUMBER;--转账总笔数
    SUM_SUNAMOUT;--转账总金额
    BEGIN
      SELECT SUM(*),SUM(AMOUNT) INTO SUM_CNUMBER,SUM_CAMOUT FROM TRAN_FLOW WHERE STATUS=90 (AND TRAN_DATE BETWEEN TO_DATE(IN_BEGINDATE, 'yyyy/MM/dd HH24:mi:ss') AND
             TO_DATE(IN_ENDDATE, 'yyyy/MM/dd HH24:mi:ss') AND CLIENT_NO=IN_CLIENTNO);--后面为条件SELECT SUM(*),SUM(AMOUNT) INTO SUM_SNUMBER,SUM_SAMOUT FROM TRAN_FLOW WHERE STATUS=91 (AND TRAN_DATE BETWEEN TO_DATE(IN_BEGINDATE, 'yyyy/MM/dd HH24:mi:ss') AND
             TO_DATE(IN_ENDDATE, 'yyyy/MM/dd HH24:mi:ss') AND CLIENT_NO=IN_CLIENTNO);SELECT SUM(*),SUM(AMOUNT) INTO SUM_SUMNUMBER,SUM_SUNAMOUT FROM TRAN_FLOW;
     
    OUT_RETCODE:= ;--填写你想输出的参数就行 OUT_RESULTOUT_RESULT:= ;--填写你想输出的参数就行
    END;
      

  2.   

    AND TRAN_DATE BETWEEN TO_DATE(IN_BEGINDATE, 'yyyy/MM/dd HH24:mi:ss') AND
             TO_DATE(IN_ENDDATE, 'yyyy/MM/dd HH24:mi:ss') AND CLIENT_NO=IN_CLIENTNO;
    后面的条件根据楼主自己的需要添加,上面的条件是时间在输入的开始时间和结束时间内的,还有根据客户号和客户姓名查询等。
      

  3.   

    存储过程的写法,注意返回的游标类型我帮你改了下.CREATE OR REPLACE PROCEDURE PROC_STATIS_TRANSFER
    (
      IN_BEGINDATE in VARCHAR2,
      IN_ENDDATE in VARCHAR2,
      IN_CLIENTNO IN VARCHAR2,
      IN_CLIENTNAME IN VARCHAR2,
      OUT_RETCODE OUT VARCHAR2,
      OUT_RESULT OUT SYS_REFCURSOR
    )
    as
      sql_txt varchar2(1000);
    begin
      sql_txt := 'select min(CLIENT_NO),
        sum(case STATUS when 90 then 1 else null end),  --转账成功总笔数
        sum(case STATUS when 91 then 1 else null end),  --转账失败总笔数
        sum(case STATUS when 90 then AMOUNT  else null end),  --转账成功总金额
        sum(case STATUS when 91 then AMOUNT else null end),  --转账失败总金额
        count(*),
        sum(AMOUNT)
        from TRAN_FLOW where CLIENT_NO=' || IN_CLIENTNO
        || ' and TRAN_DATE>to_date(''' || IN_BEGINDATE
        || ''') and TRAN_DATE<to_date(''' || IN_ENDDATE || ''')';
      dbms_output.put_line(sql_txt);
      open OUT_RESULT for sql_txt;
      OUT_RETCODE := '0';
    EXCEPTION
      when others then
        OUT_RETCODE := '1';
    end;调用的例子
    declare
      l_clientno VARCHAR2(100);
      l_successcnt VARCHAR2(100);
      l_failurecnt VARCHAR2(100);
      l_successamount VARCHAR2(100);
      l_failureamount VARCHAR2(100);
      l_cnt VARCHAR2(100);
      l_amount VARCHAR2(100);
      OUT_RETCODE VARCHAR2(100);
      OUT_RESULT SYS_REFCURSOR;
    begin
      PROC_STATIS_TRANSFER(sysdate-10, sysdate, '1', null, out_retcode, out_result);
      loop
        fetch out_result into l_clientno, l_successcnt, l_failurecnt,
          l_successamount, l_failureamount, l_cnt, l_amount;
        exit when out_result%notfound;
        dbms_output.put_line(l_clientno || ' ' || l_successcnt || ' ' || l_amount);
      end loop;
    end;