一个通过Oracle8i存储过程,返回记录集的程序包(存储过程)

2023-12-17 07:18

本文主要是介绍一个通过Oracle8i存储过程,返回记录集的程序包(存储过程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CREATE OR REPLACE  PACKAGE BODY "SMS_PAY"."SMSMAINT"                                                                              
IS
 
 --功能描述:查询代理银行交易流水信息 writer: wang haibo 2004-08-24
 PROCEDURE GetAgtBankFlow(AreaCode in varchar2,KeyWord in varchar2,startTradeDate in varchar2,endTradeDate in varchar2,Re_CURSOR OUT T_CURSOR,ret out number)
   is
   
  IsExists number;
  
  strSQL VARCHAR2(2048);
  

 Begin

  --检查临时表是否已经存在,如果不存在,则创建,否则插入数据 start
 Select Count(*) Into IsExists from all_tables Where Table_Name='TEMPAGTBANKFLOW';
 
       
 IF IsExists=0 Then
 
    strSQL:='CREATE GLOBAL TEMPORARY TABLE  SMS_PAY.TEMPAgtBankFlow
      (AGTID VARCHAR2(13) ,BANK_GLIDE Number(12),TradeType VARCHAR2(20),Trade_Money Number(14,2),
      TRADEDATE VARCHAR2(10),TRADETIME VARCHAR2(8),BankNAME VARCHAR2(30),
      AreaCode Varchar2(30), AreaName VARCHAR2(30),State VARCHAR2(30),CheckFlag Number(1),
      StatusFlag Number(1),SuccFlag Number(1)) on commit preserve rows';

     --把临时表的创建选项由on commit delete rows改为on commit preserve rows; 
     --否则在调用的时候,回出现ORA-08103: object no longer exists
    
     Execute Immediate strSQL;
    
  Else
    
     Execute immediate 'Truncate table Sms_pay.TEMPAGTBANKFLOW';
    
  End IF;
  --检查临时表是否已经存在,如果不存在,则创建,否则插入数据 end
   
  ---功能:把满足条件的一级代理商转帐信息导入数据库 Start
 
  /*strSQL:='Insert Into TEMPAgtBankFlow
           Select A.Agent_Mobile,A.Bank_Glide,
            Decode(A.OPTCode,''100'',''交款交易'',''101'',''交款冲正'',''900'',''抹帐交易'',''类型不明'') as TradeType,A.Trade_Money,
            TO_Char(To_Date(A.Trade_Date,''YYYYMMDD''),''YYYY-MM-DD'') as TradeDate,
            TO_Char(To_Date(A.Trade_Time,''hh24miss''),''hh24:mi:ss'') as TradeTime,B.BankName,C.AreaCode,C.AreaName,
            (Case When CheckFlag=-1 Then ''/Images/state_rollback.gif'' When SuccFlag=-1 Then ''/Images/state_cancel.gif'' When StatusFlag=-1 Then ''/Images/state_unnormal.gif'' Else ''/Images/state_normal.gif'' End) as State
           From Bank_Stream_Account A,BankInfoConfig B,AreaConfig C,FstAgtAccount D
            Where A.Bank_ID=B.BankCode And Trim(A.Agent_Mobile)=D.AgtID And C.CityCode=D.CityCode ';
                   
  IF AreaCode!='0' Then   --条件1: 选择所有地区的信息    
     strSQL:=strSQL || ' And Trim(C.AreaCode)=''' || AreaCode || ''' ';
  End IF;  
    
  IF TradeDate!=' ' Then  --条件2: 选择所有地区的信息,选择所有交易日期的信息

     strSQL:=strSQL || ' And TO_Char(To_Date(A.Trade_Date,''YYYYMMDD''),''YYYY-MM-DD'')=''' || TradeDate || ''' ';       
          
  End If;
 
  IF KeyWord!=' ' Then  --条件3: 选择所有地区的信息,选择所有交易日期的信息,选择和查询关键字匹配的信息
    
     strSQL:=strSQL || '  And (D.AgtID Like''%' || KeyWord || '%'' Or TO_Char(A.BANK_GLIDE) Like ''%' || KeyWord || '%'' Or B.BankName Like ''%' || KeyWord ||'%'') ';
 
  End If; 
 
  Execute Immediate strSQL;    
 
  ---功能:把满足条件的一级代理商转帐信息导入数据库 End
  */
 
  ---功能:把满足条件的二级代理商转帐信息导入数据库 Start
   strSQL:='Insert Into TEMPAgtBankFlow
                 Select A.Agent_Mobile,A.Bank_Glide,
                   Decode(A.OPTCode,''100'',''交款交易'',''101'',''交款冲正'',''900'',''抹帐交易'',''类型不明'') as TradeType,A.Trade_Money,
                   TO_Char(To_Date(A.Trade_Date,''YYYYMMDD''),''YYYY-MM-DD'') as TradeDate,
                   TO_Char(To_Date(A.Trade_Time,''hh24miss''),''hh24:mi:ss'') as TradeTime,B.BankName,C.AreaCode,C.AreaName,
                   (Case When CheckFlag=-1 Then ''/Images/state_rollback.gif'' When SuccFlag=-1 Then ''/Images/state_cancel.gif'' When StatusFlag=-1 Then ''/Images/state_unnormal.gif'' Else ''/Images/state_normal.gif'' End) as State,
                   A.CheckFlag,A.StatusFlag,A.SuccFlag
                 From Bank_Stream_Account A,BankInfoConfig B,AreaConfig C,SecAgtAccount D,FstAgtAccount E
                   Where A.Bank_ID=B.BankCode And Trim(A.Agent_Mobile)=D.AgtID And D.BossAgtID=E.AgtID And C.CityCode=E.CityCode ';
 
  IF AreaCode!='0' Then   --条件1: 选择所有地区的信息
    
     strSQL:=strSQL || ' And Trim(C.AreaCode)=''' || AreaCode || ''' ';
    
  End IF;  
    
  IF startTradeDate!=' ' Then  --条件2: 选择所有地区的信息,选择所有交易开始日期的信息

     strSQL:=strSQL || ' And TO_Char(To_Date(A.Trade_Date,''YYYYMMDD''),''YYYY-MM-DD'')>=''' || startTradeDate || ''' ';       
          
  End If;
 
  IF endTradeDate!=' ' Then  --条件2: 选择所有地区的信息,选择所有交易截止日期的信息

     strSQL:=strSQL || ' And TO_Char(To_Date(A.Trade_Date,''YYYYMMDD''),''YYYY-MM-DD'')<=''' || endTradeDate || ''' ';       
          
  End If;
 
  IF KeyWord!=' ' Then  --条件3: 选择所有地区的信息,选择所有交易日期的信息,选择和查询关键字匹配的信息
    
     strSQL:=strSQL || '  And (D.AgtID Like''%' || KeyWord || '%'' Or TO_Char(A.BANK_GLIDE) Like ''%' || KeyWord || '%'' Or B.BankName Like ''%' || KeyWord ||'%'') ';
 
  End If; 
                
      
  Execute Immediate strSQL;    
    ---功能:把满足条件的二级代理商转帐信息导入数据库 End

 Open Re_CURSOR For 'Select * From Sms_pay.TEMPAgtBankFlow Order by AgtID';  --生成返回结果集的Curso
 
 ret:=0;
 return;

 Exception

  when others then
  DBMS_OUTPUT.PUT_LINE(SQLERRM);
  ret:=999;  
  return;
  End GetAgtBankFlow;
 
 
 
 
  
 --功能描述:查询代理商钱包余额信息 writer: wang haibo 2004-08-24
 PROCEDURE GetAgtBalance(AreaCode in varchar2,KeyWord in varchar2,Re_CURSOR OUT T_CURSOR,ret out number)
   is
  pFSTAGTID VARCHAR2(13);
  pSECAgtID  VARCHAR2(13);
  pAgtBalance NUMBER(10,2);
  pAgtProfit  NUMBER(10,2);
  pAreaCode VARCHAR2(10);
  pAreaName VARCHAR2(30);
  pAgtCount NUMBER(10);
 
  IsExists number;
  subAgtNumber number;

 type c_GetBalance is ref cursor;

  FstCursor c_GetBalance;

  strSQL VARCHAR2(1024);
 

 Begin

  -- 打开游标,根据SQL语句获取1级代理商资料,然后根据1级代理商的资料获取2级代理的信息

  IF AreaCode!='0' And KeyWord=' ' Then
  
     strSQL:='Select A.AgtID,'''',A.Agtcredit,A.AgtProfit,
             B.AreaCode,B.AreaName,0 From Sms_Pay.FstAgtAccount A,Sms_Pay.AreaConfig B
             Where A.IsActive=1 And A.CityCode=B.CityCode And B.AreaCode =''' || AreaCode ||'''';          
    
       
  ElsIf (Trim(AreaCode)!='0' And KeyWord!=' ') Then
     strSQL:='Select A.AgtID,'''',A.Agtcredit,A.AgtProfit,
             B.AreaCode,B.AreaName,0 From Sms_Pay.FstAgtAccount A,Sms_Pay.AreaConfig B
             Where A.IsActive=1 And A.CityCode=B.CityCode And B.AreaCode =''' || AreaCode ||
             ''' And (B.AreaName Like ''%' || Trim(KeyWord) || '%'' Or  A.AgtID Like ''%' || Trim(KeyWord) || '%'')';
 
  ElsIf (Trim(AreaCode)='0' And KeyWord=' ') Then
   
     strSQL:='Select A.AgtID,'''',A.Agtcredit,A.AgtProfit,
             B.AreaCode,B.AreaName,0 From Sms_Pay.FstAgtAccount A,Sms_Pay.AreaConfig B
             Where A.IsActive=1 And A.CityCode=B.CityCode';               
 
  Else
     strSQL:='Select A.AgtID,'''',A.Agtcredit,A.AgtProfit,
             B.AreaCode,B.AreaName,0 From Sms_Pay.FstAgtAccount A,Sms_Pay.AreaConfig B
             Where A.IsActive=1 And A.CityCode=B.CityCode
             And (B.AreaName Like ''%' || KeyWord || '%'' Or  A.AgtID Like ''%' || KeyWord || '%'')';
   
  End If;
 
  
  Open FstCursor For strSQL;

  --检查临时表是否已经存在,如果不存在,则创建,否则插入数据 start
 Select Count(*) Into IsExists from all_tables Where Trim(Table_Name)='TEMPAGTBALANCE';

 IF IsExists=0 Then
    strSQL:='CREATE GLOBAL TEMPORARY TABLE  SMS_PAY.TEMPAgtBalance
      (FSTAGTID VARCHAR2(13) ,SECAgtID  VARCHAR2(13),ParentID  VARCHAR2(13),
      AgtBalance NUMBER(10,2),AgtProfit NUMBER(10,2),AreaCode VARCHAR2(10),
      AreaName VARCHAR2(30),AgtCount NUMBER(10)) on commit preserve rows';

     --把临时表的创建选项由on commit delete rows改为on commit preserve rows; 
     --否则在调用的时候,回出现ORA-08103: object no longer exists
     --DBMS_OUTPUT.PUT_LINE(strSQL);
     Execute Immediate strSQL;
  Else
     execute immediate 'Truncate table Sms_pay.TEMPAgtBalance';
  End IF;
  --检查临时表是否已经存在,如果不存在,则创建,否则插入数据 end
      
 Loop

  Fetch FstCursor into pFSTAGTID,pSECAgtID, pAgtBalance,pAgtProfit,pAreaCode, pAreaName, pAgtCount ;
   
  Exit when FstCursor%NOTFOUND;

  --1:写1级代理商查询信息
  strSQL:='Insert into TEMPAgtBalance(FSTAGTID,SECAgtID, ParentID,AgtBalance,AgtProfit,AreaCode, AreaName, AgtCount)
           Values(''' || pFSTAGTID || ''',null,null,' || pAgtBalance || ',' || pAgtProfit || ',''' || pAreaCode || ''','''
           || pAreaName || ''',' || pAgtCount || ')';
   
    Execute Immediate strSQL;
   
  --2:写2级代理商查询信息
  strSQL:='Insert into TEMPAgtBalance Select null,AGTID,''' || pFSTAGTID ||''',AGTCREDIT,AGTPROFIT ,''' || pAreaCode || ''',''' || pAreaName || ''',0 From SecAgtAccount Where Trim(BOSSAGTID)=''' || pFSTAGTID || '''';
  
  Execute Immediate strSQL;
           
    --3:更新1级代理的下级别代理商数量
    strSQL:='Select Count(*) From TEMPAgtBalance Where SECAgtID is not null And ParentID=''' || pFSTAGTID || '''';
    --DBMS_OUTPUT.PUT_LINE(strSQL);
    Execute Immediate strSQL  Into subAgtNumber;
    --Select Count(*) Into subAgtNumber From TEMPAgtBalance Where SECAgtID is not null And ParentID=pFSTAGTID;
   
    DBMS_OUTPUT.PUT_LINE(subAgtNumber);
       
    strSQL:='Update TEMPAgtBalance Set AgtCount=' || subAgtNumber || ' Where SECAgtID is null And FSTAGTID=''' || pFSTAGTID || '''';
    Execute Immediate strSQL;
   
    --DBMS_OUTPUT.PUT_LINE(strSQL);
    --Update TEMPAgtBalance Set AgtCount=subAgtNumber Where SECAgtID is null And FSTAGTID=pFSTAGTID;
      
 End loop;
 
     
 Close FstCursor;

 Open Re_CURSOR For 'Select * From Sms_pay.TEMPAgtBalance';
 
 ret:=0;
 return;

 Exception

  when others then
  DBMS_OUTPUT.PUT_LINE(SQLERRM);
  ret:=999;  
  return;
  End GetAgtBalance;
 
 
 
End ;

 

这篇关于一个通过Oracle8i存储过程,返回记录集的程序包(存储过程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/503544

相关文章

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

PyInstaller打包selenium-wire过程中常见问题和解决指南

《PyInstaller打包selenium-wire过程中常见问题和解决指南》常用的打包工具PyInstaller能将Python项目打包成单个可执行文件,但也会因为兼容性问题和路径管理而出现各种运... 目录前言1. 背景2. 可能遇到的问题概述3. PyInstaller 打包步骤及参数配置4. 依赖

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务