Oracle存储过程特殊数据-分列-临时表创建-批量处理,存储过程处理返回值

Oracle中的临时表Temporary Table Oracle中的临时表(Temporary Table,性能优化的利器 阅读详情

// 1.创建存储过程(输入参数,输出参数int 类型,输入类型集合-返回java中处理)

create or replace procedure "FM_BILL_HIS_CODE"(start_num    in varchar,
                                       end_num      in varchar,
                                       bill_type_id in varchar ,
                                       out_int out int,                                      
                                       out_list out SYS_REFCURSOR) as--返回集合
                                       

begin
  if bill_type_id = '2' then
    merge into fm_bill a
    using (select * from view_hrp_his@dblink where substr(billcode,4,11)  between start_num and end_num  and length(billcode)=14 and billtypecode=bill_type_id )b
    on (a.bill_code = substr(b.billcode,4,11) and a.bill_code between start_num and end_num and a.bill_type_code = bill_type_id  )
      when matched then
        
        update  set a.use_name = b.useperson,         
           a.bill_status    = decode(b.billstatus,'1','6','2','8','3','8',''),
           a.his_status     = b.billstatus,           
           a.destory_status = decode(b.billstatus,'2','6','3','6',null),
           a.destory_date   =  decode(b.billstatus,'2',b.destorydate,'3',b.destorydate,null),  
           a.expend_use    = b.useperson,      
           a.bill_money    = b.usemoney,
            a.expend_date    = b.usedate,
           a.is_his = '1'
           where  a.is_his='0'; 
            
     open out_list for  select a.*,start_num,end_num,'0'  from view_hrp_his@dblink a 
          where (  
              (substr(a.billcode,19,11) between  start_num and end_num and length(a.billcode)=29)
            or (substr(a.billcode,34,11) between start_num and end_num and length(a.billcode)=44)
            or (substr(a.billcode,49,11) between start_num and end_num and length(a.billcode)=59)
            or (substr(a.billcode,64,11) between start_num and end_num and length(a.billcode)=74)
            or (substr(a.billcode,79,11) between start_num and end_num and length(a.billcode)=89)
           ) and length(a.billcode) != 14 and a.billtypecode='2';
       out_int:=2;  
        
  else          
    merge into fm_bill a
     using (select * from view_hrp_his@dblink where billcode between start_num and end_num   and billtypecode=bill_type_id )b
     on (a.bill_code = b.billcode and a.bill_code between start_num and end_num and a.bill_type_code = bill_type_id )
     when matched then
      update  set a.use_name = b.useperson,         
         a.bill_status    = decode(b.billstatus,'1','6','2','8','3','8',''),
         a.his_status     = b.billstatus,           
         a.destory_status = decode(b.billstatus,'2','6','3','6',null),
         a.destory_date   =  decode(b.billstatus,'2',b.destorydate,'3',b.destorydate,null),  
         a.expend_use    = b.useperson,      
         a.bill_money    = b.usemoney,
         a.expend_date    = b.usedate,
         a.is_his = '1' where  a.is_his='0'; 
          out_int:=3; 
  
  end if;

exception
  when others then
  out_int:=0;
    dbms_output.put_line('error');
end;
 

 

 

 

// 第二步骤,java数据同步
    @RequestMapping(params = "sysnocheBill")
    @ResponseBody
    public AjaxJson sysnocheBill(String ids,HttpServletRequest request){
        AjaxJson j  = new AjaxJson();
        String msg="同步失败";
         // 添加单据
        BaseDaoUtil b = new BaseDaoUtil();
         PreparedStatement ps = null;
         Connection conn = b.getCon();
         int count = 0;
         try {
             FmBillUseBEntity t = systemService.getEntity(FmBillUseBEntity.class,ids);
             CallableStatement call=conn.prepareCall("{call fm_bill_his_code(?,?,?,?,?)}");//运行sp_test_1存储过程(注:存储过程接收参数和输出参数Java都有打?问号)
             call.setString(1, t.getStartNum());//设置参数
             call.setString(2, t.getEndNum());//设置参数
             call.setString(3, t.getBillTypeCode());//设置参数
             call.registerOutParameter(4, OracleTypes.INTEGER);//接收返回值
             //call.registerOutParameter(5, OracleTypes.CURSOR);//接收返回值 
             call.execute();//执行
             count=call.getInt(4); //拿取存储过程返回值
             if(count !=0){
                 // 批量处理^多门诊数据
                 /** 更新数据信息  **/
                 if(count == 2){// 门诊票据
                      /*ResultSet rs=(ResultSet)call.getObject(5);//拿取存储过程返回的集合
                      if(rs != null){
                          while(rs.next()){
                              String billCode=rs.getString("BILLCODE");
                              String usePerson=rs.getString("USEPERSON");
                              String useMoney=rs.getString("USEMONEY");
                              String useDate=rs.getString("USEDATE");
                              if(useDate.length() == 21){
                                  useDate=useDate.substring(0,useDate.length()-2);
                              }
                              String hisBillStatus=rs.getString("BILLSTATUS");
                              String destoryDate=rs.getString("DESTORYDATE");
                              if(destoryDate != null && destoryDate.length() == 21){
                                  destoryDate=destoryDate.substring(0,destoryDate.length()-2);
                              }
                              String[] aa = billCode.split("\\^");
                              String mainCode =null;
                              String billCodes="";
                              for(int i=0;i<aa.length;i++){
                                  if(i==0){// 若0当主信息
                                      mainCode=aa[0];
                                      // 门诊
                                      if(mainCode != null && mainCode.length() == 14){
                                          mainCode = mainCode.substring(3);
                                      }
                                      // 执行第一张票据(只保存第一张票据的金额,其他的金额改为0) 例如:'12313^12313^43535'
                                      opteraBillCode(mainCode,usePerson,useMoney,useDate,hisBillStatus,null,destoryDate);
                                  }else{
                                      if(aa[i] != null && aa[i].length() == 14){
                                          aa[i] = aa[i].substring(3);
                                      }
                                      billCodes=billCodes+"'"+aa[i]+"',";
                                  }
                              }
                              opteraBillCode(billCodes.substring(0,billCodes.length()-1),usePerson,useMoney,useDate,hisBillStatus,mainCode,destoryDate);
                          }
                      }*/
                 }
                 msg = "成功";
             }else{
                 msg = "同步失败HIS数据有重复使用记录请检查!";
             }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            if(ps != null){
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
         j.setMsg(msg);
        return j;
    }

掌握Oracle存储过程与临时表的应用 在数据库管理系统中,临时表是一种特殊类型的表,它为特定的数据库会话或事务提供存储空间来存储临时数据。了解临时表的定义及其生命周期对于数据库管理员和开发人员来说至关重要,因为临时表可以帮助他们有效地管理临时数据,提高查询性能,并简化应用程序逻辑。在本章节中,我们将详细探讨临时表的概念以及它们在数据库系统中的存在周期。临时表是一种为特定会话或事务提供临时存储的数据库对象。它们与永久表的主要区别在于,临时表不存储在数据库的数据文件中,而是存储在内存中或者临时段(tempfile)中。 阅读详情

相关推荐

Oracle数据库中的临时表使用指南

在现代数据库管理系统中,临时表是一种特殊类型的表,它用于存储中间结果集,这些结果集只在当前用户会话或事务中可见,并且在会话结束或事务提交或回滚时自动清除。Oracle数据库提供了这样的机制,允许开发者在事务处理过程中有效地管理临时数据。临时表的引入解决了几个关键的问题,特别是在处理大量数据和执行复杂查询时。它们可以帮助减少内存使用,优化性能,并且提供了一个干净的环境,以便不同的会话或事务不会相互干扰。此外,临时表还具备一些独特的特性。

weixin_35750747的博客 1387

oracle数据归档存储过程,Oracle案例:利用存储过程进行表数据分离

某客户有个需求,有2张业务表,数据量比较大,有2000W行,现在的需求是把这2张表中的一部分记录,根据一定的where条件分离出去,创建到另外的归档表中,即做表记录的迁移操作。最后得到的结果是:未满足筛选条件的记录留在原表中,满足筛选条件的表要插入到归档表中,并且要在原表中删除这些插入到归档表中的全部记录,最后满足:新表记录+归档记录=原表记录数下面我来模拟一下这个过程:由于没有拿到具体的建表语句...

weixin_28783097的博客 400

告别Root!用Python脚本一键解密Android微信EnMicroMsg.db数据库(附完整源码)

本文详细介绍了如何在非Root环境下使用Python脚本一键解密Android微信EnMicroMsg.db数据库。通过ADB调试接口和SQLCipher技术,实现自动化提取和解密微信聊天记录数据库,无需Root权限,适合数据分析师和普通用户安全备份数据。

weixin_29266007的博客 331

Oracle分表分区实战(含索引,检查处理)

背景 业务需要,未来会对线上环境的一张表每月存储2000w+的数据。一年就达到上亿级??数据量其大可想而知,然而这张表又是单库单表存储,这样的方式肯定是不足以支撑千万甚至上亿万级的数据,大数据量的表还会导致查询随着数据量的增大而不断性能变低,甚至会导致数据库宕机。那么如何处理上千万级,甚至上亿级的数据呢?采用的是分表分区的方式(还可以分库)。遂写次博客记录一下。 前言 公司用的是Oracle数据库,那么Oracle数据库是怎样的存储结构呢??里面用户,表,表空间,dbf文件的关系又是怎样的呢??这里有必要先

qq_38425803的博客 6809

win10离线安装.NetFrameWork3.5出现0x800F081F解决办法。

由于公司开发环境是内网,并且安装arcgis10.2又需要.NetFrameWork3.5的环境,安装.NetFrameWork3.5的又总是报错“0x800F081F”找不到源文件。折腾了两天总算解决了。 首先我们能在网上搜索到的教程,你一定看到过这样的教程,就是使用下面的命令来进行安装。 dism /online /Enable-Feature /Featu...

AIGIS的博客 1万+

斗罗大陆叙事体系与战斗系统设计解析

在文学创作与游戏设计中,世界观构建和战斗系统设计是两大核心技术要素。世界观作为故事发生的背景框架,需要融合东西方文化元素并建立量化标准,如《斗罗大陆》中武魂觉醒与魂环等级体系。战斗系统则需突破简单数值对抗,发展出武魂特性、魂技组合与环境互动的三维体系,其中魂导器技术的引入展现了科技与魔法的创新融合。这些设计原理在RPG游戏开发、网络文学创作等领域具有广泛应用价值,特别是对需要长期运营的IP作品,完善的系统设定能有效支撑剧情延展与商业化开发。本文以现象级作品为例,剖析其武魂拟态理论和魂师工业化构思如何成就经典

weixin_29291069的博客 250

oracle 调用分区函数,ORACLE定时任务调用存储过程动态为表添加分区

1、创建需要自动分区的表CREATE TABLE TEST(M DATA)PARTITION BY RANGE(M)(PARTITION TEST_PAR_99991212 VALUES LESS THAN(TO_DATE('12-12-9999','DD-MM-YYYY')));说明:创建的表必须要有一个足够大的初始分区,因为后续增加分区是基于当前这个分区上面分裂而来的。2、创建存储过程CREA...

weixin_42429956的博客 430

从平面到立体:一张图看懂MOSFET、FinFET到GAAFET的演变史(附结构对比图)

本文深入解析了半导体晶体管从平面MOSFET到三维FinFET,再到全环绕栅极GAAFET的技术演进历程。通过结构对比图和物理原理分析,揭示了每一次创新如何解决短沟道效应等关键挑战,推动芯片性能提升。特别关注GAAFET作为最新技术突破的架构特点和性能优势。

weixin_30892037的博客 698

在ORACLE里用存储过程定期分割表

Oracle数据库里存放着各种各样的数据,其中有一些数据表会随着时间的推移,越来越大。如交友聊天的日志、短信收发的日志、生产系统的日志、动态网站发布系统的日志等等。这样的信息又和时间紧密相关,有没有办法让这些日志表能按时间自动分割成历史年月(如log200308,log200309)的表呢? 请看看用存储过程定期分割表的方法吧。 一、问题的引出   1.初学数据库时只知道用delete来删除表里的

domino的专栏 889

【入门AUTOSAR网络管理测试】AUTOSAR网络管理规范需求解读

AUTOSARAutomotive Open System Architecture,汽车开放系统架构,由全球汽车制造商、部件供应商及其他电子、半导体和软件系统公司联合建立,致力于制定汽车电子软件标准的联盟。网络管理网络管理的目的是使网络中的ECU节点有序的睡眠和唤醒。在没有通信需求的时候睡眠,在需要通信的时候唤醒,可以节约汽车电池的电量。

测试领域技术分享 5166

AI Agent开发第82课-手把手教你把paddleocr-vl做成mcp使其在DIFY里运行

本文详解如何将国产顶尖多模态 OCR 模型 PaddleOCR-VL 封装为标准 MCP(Model Calling Protocol)服务,并通过自研的 HTTP-based MCP Client 接入 Dify 1.10,实现 AI Agent 在对话中自动识别并调用 OCR 能力。该方案已在某头部保险公司真实业务流程中落地,使用了当前最先进的“Agentic AI 原生”设计思想。

打造全国最全的AI Agent开发知识领域的博客 1626

oracle分区表分区导出,ORACLE 分区表定期自动分区导出及删除导出分区(三)

3. 存储过程每天自动增加第二天的分区,保证第二天生产需要,删除分区的部分则根据前面记录的表的状态,利用存储过程判断删除分区是否已经成功导出,若记录时间、表名、分区名对应状态为1,则删除该分区,否则不作处理,存储过程代码如下:CREATE OR REPLACE PROCEDURE TOPUP.sp_tab_maintain_partitionsISG_USER_NAME VARCHAR2 (5...

weixin_33111267的博客 262

STM32F103待机模式原理与低功耗实战指南

待机模式是嵌入式系统实现超低功耗的核心机制,其本质是通过切断内核域电源(VDD/VDDA)实现微安级静态电流,区别于睡眠/停止模式的状态保持特性。原理上依赖电源域隔离、WKUP引脚事件唤醒与RTC备份域协同,技术价值在于支撑电池供电设备长达数年续航。典型应用场景包括物联网传感器节点、智能电表、便携医疗设备等对功耗极度敏感的终端。工程落地需严格遵循GPIO模拟输入配置、唤醒标志清除、备份域解锁等关键步骤,避免因漏电或误唤醒导致实测电流超标。本文以STM32F103为例,深入解析待机模式的硬件基础与HAL库实现

weixin_32999557的博客 66

Oracle数据库临时表

一、前言 我们在创建数据表的时候,若没有特殊的指明,那么我们创建的表是一个永久的关系型表格,也就是说,这个表格中对应的数据,除非是我们显示的删除的话,表中的数据是永远都存在的。相对应的,在Oracle数据库中还有一种类型的表,叫做临时表。这个临时表跟永久表最大的区别就是表中的数据不会永远的存在。当一个会话结束或者事务结束的时候,这个临时表中的数据,不用用户自己删除,数据库自己会自动...

汤庆 1万+

机器人中的数值优化(十三)——QP二次规划

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例

慕羽★的博客 2793

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

oracle的临时表总结

oracle创建临时表。

风归去. 5605

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Oracle临时表详解

临时表是一种特殊的表。当我们需要对某一(也可以是多个)表中的一批数据进行反复的操作时,通过对这批数据创建一个临时表,可能会简化操作并且有可能提高效率!

专注Java后端技术干货、项目源码总结分享,期待您的关注。 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Oracle创建临时表

Oracle临时表 临时表是一种特殊的表。当需要对某一(也可以是多个)表中的一批数据进行反复的操作时,通过为这批数据创建一个临时表,可能会简化操作并且有可能提高效率。 语法: CREATE GLOBAL TEMPORARY TABLE 临时表空间名 ON COMMIT DELETE ROWS ON COMMIT PRESERVE ROWS (colum,coulum,…); 说明: ON COMMIT DELETE ROWS : (说明数据行只有在当前事务中可见,也是默认值,事务提交后数据行将消失) O

君子不怨天的博客 1万+

Oracle为什么需要临时表?——让数据处理更灵活

Oracle临时表是一种特殊表结构,用于临时存储中间数据,能有效解决复杂查询性能优化、ETL流程数据一致性和多会话隔离等痛点。临时表分为会话级(PRESERVE ROWS)和事务级(DELETE ROWS),前者数据保留至会话结束,后者随事务提交自动清空。主要应用场景包括拆分复杂SQL提升性能、作为ETL缓冲区确保数据安全、实现会话隔离避免锁竞争等。通过合理使用临时表,可以简化业务逻辑、提高查询效率,同时减少资源消耗。

qq_39980997的博客 1142

oracle 建立临时表语句,oracle创建临时表

Oracle数据库临时表管理心得我们在创建数据表的时候,若没有特殊的指明,那么我们创建的表是一个永久的关系型表格,也就是说,这个表格中对应的数据,除非是我们显示的删除的话,表中的数据是永远都存在的。相对应的,在Oracle数据库中还有一种类型的表,叫做临时表。这个临时表跟永久表最大的区别就是表中的数据不会永远的存在。当一个会话结束或者事务结束的时候,这个临时表中的数据,不用用户自己删除,数据库自己...

weixin_30825953的博客 4890

基于oracle数据库存储过程的创建及调用

基于oracle数据库存储过程的创建及调用 教学大纲: PLSQL编程:Hello World、程序结构、变量、流程控制、游标. 存储过程:概念、无参存储、有参存储(输入、输出). JAVA调用存储存储过程. 1. PLSQL编程 1.1. 概念和目的 什么是PL/SQL? PL/SQL(Procedure Language/SQL) PLSQL是Oracle对sql语言的过...

黑马程序员官方博客 5041

Oracle数据库临时表-----会话级的临时表和事务级的临时表

我们在创建数据表的时候,若没有特殊的指明,那么我们创建的表是一个永久的关系型表格,也就是说,这个表格中对应的数据,除非是我们显示的删除的话,表中的数据是永远都存在的。相对应的,在Oracle数据库中还有一种类型的表,叫做临时表。这个临时表跟永久表最大的区别就是表中的数据不会永远的存在。当一个会话结束或者事务结束的时候,这个临时表中的数据,不用用户自己删除,数据库自己会自动清除。  会话

phoenix_qiqi的专栏 9118

ORACLE临时表空间总结

临时表空间概念 临时表空间用来管理数据库排序操作以及用于存储临时表、中间排序结果等临时对象,当ORACLE里需要用到SORT的时候,并且当PGA中sort_area_size大小不够时,将会把数据放入临时表空间里进行排序。像数据库中一些操作: CREATE INDEX、 ANALYZE、SELECT DISTINCT、ORDER BY、GROUP BY、 UNION ALL、 INTERSECT、MINUS、SORT-MERGE JOINS、HASH JOIN等都可能会用到临时表空间。当操作完成后,.

Finder_Way 3387

oracle用dual创建临时表,Oracle 学习系列之二(会话与事务级临时表和dual表 )

一、 会话临时表--创建会话临时表create global temporary table tmp_user_session(user_id int, user_name varchar2(20),user_email varchar2(30))--这句表示 当事务提交时 保留数据on commit preserve rows--向临时表中插入数据insert into tmp_user_ses...

weixin_35456296的博客 1135

Oracle - 批量操作FOR ALL,提升数据处理效率

Oracle - 批量操作 FOR ALL,提升数据处理效率 🚀 在企业级数据库应用中,Oracle 的 FORALL 语句是提升批量数据处理性能的关键工具。本文通过对比分析、原理剖析和实战演示,系统介绍了 FORALL 的高效应用。 核心要点 性能对比:FORALL 比逐行处理快 12.7 倍(万条数据测试) 工作原理: 单次 SQL 解析,批量执行 内部使用绑定数组,减少网络往返 服务端内存操作,降低上下文切换 Java 集成: 通过 JDBC 调用 PL/SQL 批量过程 使用 ARRAY 和 ST

千淘万漉虽辛苦,吹尽狂沙始到金 1万+

Oracle数据库临时表管理心得

导读:  出处:IT专家网  我们在创建数据表的时候,若没有特殊的指明,那么我们创建的表是一个永久的关系型表格,也就是说,这个表格中对应的数据,除非是我们显示的删除的话,表中的数据是永远都存在的。相对应的,在Oracle数据库中还有一种类型的表,叫做临时表。这个临时表跟永久表最大的区别就是表中的数据不会永远的存在。当一个会话结束或者事务结束的时候,这个临时表中的数据,不用用户自己删除,数据库自

Tisty的兵工厂--新Blog:http://www.UbuntuSky.cn 738
上一篇: 多数据源获取使用数据库是Oracle还是mysql
下一篇: GitHub 项目到码云,到项目的同步更新
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值