`

银行交费处理顺序(LISTAGG 列转行)

 
阅读更多
create or replace procedure SFGL_SYNCYH_TEMP(p_xn    in varchar2,
                                             p_czr    in varchar2,
                                             res_str  OUT VARCHAR2,
                                             res_code OUT VARCHAR2,
                                             res_count OUT number) is
  /**
  *  同步银行交费临时表
  *  功能:遍历学生临时表(保存银行交费信息),先根据银行账号、姓名查找应缴费用,再遍历这些费用跟银行交费费用比较,
      导入的金额处理顺序
      医保费
      住宿费
      学费
      金额是有顺序的,首先交医保费、多出来的钱再交住宿费(非走读生)、再多出来的钱交学费、
      再多出来的钱交其他费用;如果一开始交的金额不够交医保费或者住宿费,那么直接交学费;

  *  处理完后更新应缴费用表的'已缴费用'字段(银行交费就相当于已缴),
  *  然后插入一条银行划扣数据到缴费记录表中。
  *  2015年11月18日
  *   p_xn 当前学年
  *   p_czr 操作人
  *   res_str 返回执行结果
  *   res_code 返回结果代码
  *   res_count 返回导入结果数
  */
  
  p_xm varchar2(1000);  ---银行账号不对应的学生姓名
  p_yjje sfgl_xsxx_temp.yjje%TYPE; --- 已缴金额
  p_count number :=0;  --记录导入条数

begin

  ----先判断哪些学生的银行账号不存在或不对应,列转行---
  SELECT LISTAGG(tp.xm, ',') WITHIN GROUP(ORDER BY tp.xm) xm into p_xm FROM sfgl_xsxx_temp tp,sfgl_xsxx xs
  WHERE tp.yxzh != xs.yxzh and trim(tp.xm) = trim(xs.xm);

  ---遍历可以导入银行交费的学生
  for rec_xsxx in (SELECT xs.xsid,tp.yjje FROM sfgl_xsxx_temp tp,sfgl_xsxx xs WHERE tp.yxzh = xs.yxzh and trim(tp.xm) = trim(xs.xm)) loop
  --根据应缴用户、学年找应缴费用的id
     p_yjje := rec_xsxx.yjje;
     for rec_yjfy in(SELECT * FROM sfgl_yjfy WHERE yjyh=rec_xsxx.xsid and xn=p_xn 
                    order by case fylx when '3' then 1
                                       when '2' then 2
                                       when '1' then 3
                                       when '4' then 4 end) loop  
         ------------判断导入的费用是否大于未缴的医保费----------
         if rec_yjfy.fylx =3 and p_yjje >= rec_yjfy.wjfy and rec_yjfy.wjfy > 0 then  
           update sfgl_yjfy set YJFY = Fy,wjfy =0,modified_time = sysdate WHERE YJFYID = rec_yjfy.yjfyid; --更新应缴费用表
            insert into sfgl_jfjl
              (JFJLID,YJFYID,JFLX,JE,SFDY,modified_Time,modified_By,create_Time,create_By)
            values
              (Xl_Sfgl_Jfjl.NEXTVAL,rec_yjfy.yjfyid,'2',rec_yjfy.fy-rec_yjfy.yjfy,'0',sysdate,p_czr,sysdate,p_czr); --插入缴费记录表
            
            p_yjje :=p_yjje-rec_yjfy.wjfy;  ---扣完医保费所剩          
          
         ------------判断导入的费用是否大于未缴的住宿费----------
          elsif rec_yjfy.fylx =2 and p_yjje >= rec_yjfy.wjfy and rec_yjfy.wjfy > 0 then  
            update sfgl_yjfy set YJFY = Fy,wjfy =0,modified_time = sysdate WHERE YJFYID = rec_yjfy.yjfyid; --更新应缴费用表
            insert into sfgl_jfjl
              (JFJLID,YJFYID,JFLX,JE,SFDY,modified_Time,modified_By,create_Time,create_By)
            values
              (Xl_Sfgl_Jfjl.NEXTVAL,rec_yjfy.yjfyid,'2',rec_yjfy.fy-rec_yjfy.yjfy,'0',sysdate,p_czr,sysdate,p_czr); --插入缴费记录表
              
              p_yjje :=p_yjje-rec_yjfy.wjfy;  ---扣完住宿费所剩
             
           ------------判断导入的费用是否大于未缴的学费(导入金额金额大于等于未缴学费)---------- 
           elsif rec_yjfy.fylx =1 and p_yjje >= rec_yjfy.wjfy and rec_yjfy.wjfy > 0 then 
            update sfgl_yjfy set YJFY = Fy,wjfy =0,modified_time = sysdate WHERE YJFYID = rec_yjfy.yjfyid; --更新应缴费用表
            insert into sfgl_jfjl
              (JFJLID,YJFYID,JFLX,JE,SFDY,modified_Time,modified_By,create_Time,create_By)
            values
              (Xl_Sfgl_Jfjl.NEXTVAL,rec_yjfy.yjfyid,'2',rec_yjfy.fy-rec_yjfy.yjfy,'0',sysdate,p_czr,sysdate,p_czr); --插入缴费记录表
              
              p_yjje :=p_yjje-rec_yjfy.wjfy;  ---扣完学费所剩
            
           ------------判断导入的费用是否小于未缴的学费(导入金额小于未缴学费并且大于0)---------- 
           elsif rec_yjfy.fylx =1 and p_yjje < rec_yjfy.wjfy and p_yjje > 0 and rec_yjfy.wjfy > 0 then  
            update sfgl_yjfy set YJFY = YJFY+p_yjje,wjfy =wjfy-p_yjje,modified_time = sysdate WHERE YJFYID = rec_yjfy.yjfyid; --更新应缴费用表
            insert into sfgl_jfjl
              (JFJLID,YJFYID,JFLX,JE,SFDY,modified_Time,modified_By,create_Time,create_By)
            values
              (Xl_Sfgl_Jfjl.NEXTVAL,rec_yjfy.yjfyid,'2',p_yjje,'0',sysdate,p_czr,sysdate,p_czr); --插入缴费记录表
              
              p_yjje :=0;  ---扣完学费所剩      
           
            ------------判断导入的费用是否大于未缴的其他费用(导入金额大于等于未缴学费)----------    
            elsif rec_yjfy.fylx =4 and p_yjje >= rec_yjfy.wjfy and rec_yjfy.wjfy > 0 then  
              update sfgl_yjfy set YJFY = Fy,wjfy =0,modified_time = sysdate WHERE YJFYID = rec_yjfy.yjfyid; --更新应缴费用表
              insert into sfgl_jfjl
                (JFJLID,YJFYID,JFLX,JE,SFDY,modified_Time,modified_By,create_Time,create_By)
              values
                (Xl_Sfgl_Jfjl.NEXTVAL,rec_yjfy.yjfyid,'2',rec_yjfy.fy-rec_yjfy.yjfy,'0',sysdate,p_czr,sysdate,p_czr);  --插入缴费记录表 
                
                p_yjje :=p_yjje-rec_yjfy.wjfy;  ---扣完其他费所剩  
           
           ------------判断导入的费用是否小于未缴的其他费用(导入金额小于其他学费并且大于0)----------     
            elsif rec_yjfy.fylx =4 and p_yjje < rec_yjfy.wjfy and p_yjje > 0 and rec_yjfy.wjfy > 0 then  
              update sfgl_yjfy set YJFY = YJFY+p_yjje,wjfy =wjfy-p_yjje,modified_time = sysdate WHERE YJFYID = rec_yjfy.yjfyid; --更新应缴费用表 
              insert into sfgl_jfjl
                (JFJLID,YJFYID,JFLX,JE,SFDY,modified_Time,modified_By,create_Time,create_By) 
              values
                (Xl_Sfgl_Jfjl.NEXTVAL,rec_yjfy.yjfyid,'2',p_yjje,'0',sysdate,p_czr,sysdate,p_czr);   --插入缴费记录表 
                
                p_yjje :=0;  ---扣完其他费所剩     
            
         end if;
     end loop;
     
      p_count :=p_count+1;
      
  end loop;

  COMMIT;
  res_str  := p_xm;
  res_count := p_count;
  res_code := 'S';
exception
     when others then
       --res_str:=res_str||':程序运行出现内部错误,请联系管理员。'||dbms_utility.format_error_backtrace()||'---'||SQLCODE||'---'||SQLERRM;
       res_str  := '执行失败';
       res_count := 0;
       res_code := 'E';
       rollback;
end SFGL_SYNCYH_TEMP;

 ---摘自收费管理-学生学杂费-导入银行交费信息

分享到:
评论

相关推荐

    【Oracle】LISTAGG函数的使用.pdf

    Oracle LISTAGG 函数是 Oracle 11.2 中引入的一种新特性,主要功能类似于 wmsys.wm_concat 函数,即将数据分组后,把指定列的数据再通过指定符号合并。LISTAGG 函数有两个参数:要合并的列名和自定义连接符号。 ...

    Oracle函数之LISTAGG

    Oracle数据库中的LISTAGG函数是一个非常实用的聚合函数,它允许你在一组数据中对特定列的值进行排序和拼接,生成一个字符串结果。这个函数特别适用于需要将多个行的数据合并到一行的情况,例如,当你想要在一个报告...

    Oracle行转列

    列转行是指将多个列数据合并成一个列数据。例如,有一个表t_col_row,其中包含多个列c1、c2、c3,需要将这些列数据合并成一个列数据。可以使用UNION ALL、MODEL和COLLECTION等方法来实现列转行。 使用UNION ALL方法...

    oracle wm_concat 列转行 逗号分隔

    这个函数在处理特定的数据汇总和报告需求时非常有用,尤其是在你需要将某个列的多个值合并成一个字符串时。然而,需要注意的是,WM_CONCAT并不是Oracle官方提供的标准函数,它在Oracle 11g R2版本之后就被标记为不...

    oracle实现行转列功能,并使用逗号进行隔开拼接,成为一条数据.pdf

    Oracle 实现行转列功能并使用逗号...使用 WM_CONCAT 函数或 LISTAGG 函数可以实现 Oracle 中的行转列功能,并使用逗号进行隔开拼接,成为一条数据。然而,需要注意 WM_CONCAT 函数已经被弃用,建议使用 LISTAGG 函数。

    GBase8s虚拟列详解(1).docx

    2. 列表达式可以是单列、常量、条件表达式或函数表达式,但不能包含其他虚拟列,也不支持聚集函数、LISTAGG()、列转行函数等。例如,可以定义一个根据源分数(source)判断是否合格的虚拟列: ```sql CREATE TABLE sc ...

    oracle列合并的实现方法

    它可以更方便地将列值组合成一个字符串,并允许指定排序顺序。例如,如果要按`id`排序合并`name`列,可以这样写: ```sql SELECT LISTAGG(id, ',') WITHIN GROUP (ORDER BY id) AS col_name FROM tab_name; ```...

    oracle学习参考

    - **字符串的列转行**:对于简单的列转行,可以使用`LISTAGG`函数,但其灵活性有限。推荐使用自定义的函数,如`to_string_limit`,它可以更灵活地控制字符串的排序、去重和长度限制。 在实际工作中,理解并熟练...

    数据库行列转换算法

    除了基本的列转行和行转列,还可以处理更复杂的转换场景,如字符串转换成多列或多行,或者多列转换成字符串。这些转换通常涉及字符串操作函数,如REGEXP_SUBSTR用于提取字符串中的模式,以及连接函数如LISTAGG用于将...

    rowtocol.rar_RowToCol_oracle 动态列

    在Oracle数据库中,"行转列"是一种常见的数据处理需求,尤其在数据分析和报表生成时。标题中的"rowtocol.rar_RowToCol_oracle 动态列"指的是使用Oracle数据库进行行转列操作,特别是针对动态且不确定数量的列。描述...

    Oracle 行列转换 总结

    这种转换有六种情况:列转行、行转列、多列转换成字符串、多行转换成字符串、字符串转换成多列、字符串转换成多行。 1. 列转行 列转行是指将多个列转换成一个行。例如, CREATE TABLE t_col_row(ID INT, c1 ...

    oracle数据行列转换

    3. 列转行:Oracle 10g中,我们通常使用LISTAGG函数(在11g中引入,但在10g可以通过其他方式模拟)或者CONNECT BY语句来实现列转行。例如,如果我们有一个包含多个产品分类的列,希望将其拆分为多行,可以使用以下...

    数据结构————二差排序树标准写法

    二差排序树树,关于数据结构的二差排序树,仅供参考!!!!!!!!!!!!!!!!!!!

    行列转换总结.pdf

    列转行是指将数据表中的列转换为行的操作。这种转换常用于将分类数据展平,以便更好地展示数据之间的关系或进行后续的数据分析。根据给定的部分内容,我们可以通过三种不同的方法来进行列转行操作。 ##### 2.1 使用...

    oracle行列转换

    列转行是指将数据库表中的多个列转换为一行。这种操作可以使用 UNION ALL 语句、MODEL 子句和 COLLECTION 语句来实现。 1. 使用 UNION ALL 语句 UNION ALL 语句可以将多个 SELECT 语句的结果合并成一个结果集。 ...

    ACCESS 分组合并

    由于ACCESS 没有oracle的listagg函数,也没有sql server这种 for xml path 这种, 要实现分组合并需要自定义一个函数,理解了 for xml path 这个就很好理解了。

    Oracle多行记录合并

    这种方式适用于需要保留原始数据顺序或者进行XML处理的场合。 6. **`MODEL` 指令:** 这是Oracle中的高级SQL特性,可以处理复杂的矩阵运算和数据转换,包括多行记录的合并。使用`MODEL`指令需要对Oracle SQL有深入...

    SQL与PL/SQL

    - 了解SQL的逻辑执行顺序可以帮助开发者减少错误SQL的编写,并更好地处理复杂的业务逻辑。 - **物理执行顺序**: - 指SQL语句的实际执行路径,取决于Oracle的CBO(成本基础优化器)组件,涉及表统计信息、索引统计信息...

    C#俄罗斯方块程序设计

    在砖块样式配置中,使用了`Label`控件作为绘图区域,通过`Paint`事件处理函数和`MouseClick`事件处理函数,实现了方块的绘制和状态切换。 **颜色选择** `ColorDialog`控件提供了颜色选择的功能,用户可以选择任何...

Global site tag (gtag.js) - Google Analytics