热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

oraclehibernate临时表存储过程

参考资料1ORACLE存储过程返回临时表结果集http:hi.baidu.comh_sn999blogitem4211810f4d7542fdaa645738.html2ORA

参考资料 
1 ORACLE 存储过程返回临时表结果集 
http://hi.baidu.com/h_sn999/blog/item/4211810f4d7542fdaa645738.html 
2 ORACLE 在存储过程中使用临时表 
http://blog.csdn.net/wekily/article/details/6120900 
3 Oracle存储过程中创建临时表<原创> 
http://blog.sina.com.cn/s/blog_4c7ae2a80100bki3.html 
4 在ORACLE存储过程中创建临时表 
http://huqiji.iteye.com/blog/782067 
总结如下: 
DDL是一种消耗资源非常大的操作,运行时尽量不要使用DDL语句,应用程序需要的临时表应在运行之前就开始创建。不必在每个存储过程中创建一次。临时表总是存在的,他们作为对象存在于数据字典中,并且总是保持为空,直到有会话在其中放入数据 
1 创建临时表 

Sql代码 
  1. create global temporary table 表名  
  2. (  
  3.   ID               VARCHAR2(100 CHAR),  
  4.   NAME         VARCHAR2(100 CHAR)   
  5. )  
  6. on commit preserve rows;  


2 创建存储过程 

Sql代码 
  1. create or replace procedure proc_XXX(  
  2. mycur out SYS_REFCURSOR  
  3. as  
  4. TYPE My_CurType IS REF CURSOR;  
  5. CUR_1 My_CurType;  
  6. tempa varchar2;  
  7. tempb varchar2;  
  8. --此处可声明更多变更^_^  
  9. begin  
  10.    
  11.     OPEN CUR_1 FOR  select * from 表名;  
  12.     
  13.     --使用前先清空  
  14.     execute immediate 'truncate table  临时表表名';  
  15.   
  16.   LOOP  
  17.   FETCH CUR_1 INTO  tempa;  
  18.   EXIT WHEN CUR_1%NOTFOUND;  
  19.       
  20.       --进行相关的业务查询,将结果返回于更多变量上,插入临时表数据        
  21.      tempa:='1';  
  22.      tempb:='jack';  
  23.      insert into 临时表表名(ID,NAME)values(tempa,tempb);   
  24.      commit;    
  25. end loop;      
  26.   open mycur for  select * from  临时表表名;        
  27.   CLOSE  CUR_1;  
  28.   message :='查询临时表成功';  
  29.   EXCEPTION  
  30.   WHEN OTHERS THEN  
  31.    message :='查询临时表失败';  
  32. end  proc_XXX;  


参考更多 
1 创建临时表,插入数据,返回结果集 

Sql代码 
  1. CREATE OR REPLACE PROCEDURE Report_Month_Responsibility(  
  2.  o_cur OUT SYS_REFCURSOR  
  3. )  
  4. IS  
  5. STR VARCHAR2(200);  
  6. tb_count INT;  
  7. BEGIN  
  8.   --先判断全局临时表是否存在,没存在则重新建立:  
  9.   select count(*) into tb_count from dba_tables where table_name='REPROTTEST';  
  10.   if tb_count=0 then  
  11.     STR:=' CREATE GLOBAL TEMPORARY TABLE REPROTTEST(  
  12.            ID INT,  
  13.            ANAME VARCHAR2(20)  
  14.     ) ON COMMIT PRESERVE ROWS';  
  15.      execute immediate STR;  
  16.   end if;  
  17.     
  18.   STR:='INSERT INTO REPROTTEST(ID,ANAME)  VALUES(1,''1'')';  
  19.   execute immediate STR;  
  20.   COMMIT;  
  21.   STR:='SELECT * FROM REPROTTEST';  
  22.   OPEN o_cur FOR STR; -- 给游标变量赋值  
  23. END Report_Month_Responsibility;  


2 调用存储过程 

Sql代码 
  1. CREATE OR REPLACE PROCEDURE proc_X()  
  2. IS  
  3.   v_ID INT;  
  4.   v_ANAME VARCHAR2(20);        
  5.    --定义游标:  
  6.    v_account_cur SYS_REFCURSOR;  
  7. BEGIN  
  8.      --调用存储过程:  
  9.        Report_Month_Responsibility(v_account_cur);         
  10.        fetch v_account_cur into v_ID,v_ANAME;  
  11.       --用循环显示游标中的记录:  
  12.        while v_account_cur%found loop  
  13.              dbms_output.put_line('The value of column ID is: '||v_ID);--打引列ID  
  14.              dbms_output.put_line('The value of column ANAME is: '||v_ANAME);    
  15.              --打引列ANAME            
  16.              fetch v_account_cur into v_ID,v_ANAME;  
  17.        end loop;  
  18.        close v_account_cur;      
  19.        execute immediate 'truncate TABLE REPROTTEST';     
  20. end proc_X;  


  1. 解决一个上周很郁闷的问题:

    项目中有一个需求,一个表 数据量很大,有几百万条吧,保守估计,呵呵。页面上填入 每组 要显示的个数,租用时间(以秒为单位),逻辑就是我先分组,然后循环 每组里根据填入的个数查询出相应的数据,这些数据要写入到xml里,然后更新。

    只用java+sql,就是那种最普通的方式,测试之后发现查询+更新需要18分钟完成100000条记录的操作,这根本不能满足需求。

    还是请教一下别人哈,得到的答案是 在Oracle里写存储过程,我测了一下,确实快了不少。呵呵,就用它了。

    先看 存储过程怎么写吧!

    思路就是先分组,然后根据分组 每组再查询出用户要求的个数,放到一个临时表里,然后更新这些数据,最后查询出临时表里的数据返回一个游标。(注:临时表的创建放在command window 里执行)

    create or replace procedure updatePro(returndataCur out IPINFO_PACKAGE.curList,curTime in number,endTime in number,dateTime in number,num in number) is
    authId number;

    --声明变量
    pro VARCHAR2(32);
    ipInfoId number;
    info_ip number;
    maskLen number;
    portStart number;
    portEnd number;
    direct number;
    rownumber number;
    str varchar2(300);
    cnt int;
    Cursor groupCur is select auth_id,property  from ip_info group by property,auth_id;
    Cursor curListCur is select id,ip,mask_len,port_start,port_end,dir,property,auth_id from (select t.*,rownum rn from (select id,ip,mask_len,port_start,port_end,dir,property,auth_id from ip_info ip_info where USABLE_TIME_START + dateTime  <=  endTime  and  USABLE_TIME_END + dateTime  > =  endTime  and NEXT_USE_TIME <  curTime and property=pro and auth_id=authId  order by id desc) t where rownum <= num ) s where rn> 0;
        
     begin

    --赋值
    authId:=0;
    pro:='m';
    ipInfoId:=0;
    info_ip:=0;
    maskLen:=0;
    portStart:=0;
    portEnd:=0;
    direct:=0;
    rownumber:=0;
    cnt:=0;
    str:='delete from RETURNDATA';
    select count(*) into cnt from all_tables where table_name='RETURNDATA';
    --if cnt!=0 then
    --execute immediate str;
    --end if;
     --此处是游标嵌套
    open groupCur; 
    loop
    fetch groupCur into authId,pro;
    exit when groupCur%notfound;
         --dbms_output.put_line(authId||pro);

        open curListCur;   
        loop
        
          fetch curListCur into ipInfoId,info_ip,maskLen,portStart,portEnd,direct,pro,authId;
          exit when curListCur%notfound;
               dbms_output.put_line(ipInfoId);
               insert into RETURNDATA values(ipInfoId,info_ip,maskLen,portStart,portEnd,direct,pro,authId);
               update ip_info set last_use_time=curTime,next_use_time=endTime where id=ipInfoId;
              
          end loop;
          commit;
          
          close curListCur;
    end loop;

    close groupCur;
    open returndataCur for select * from RETURNDATA;
    end updatePro;

     

     

    hibernate里调用存储过程

    public List findAllIpInfoList(Long curTime,Long tempNum,Long dateTime,Integer number) {
    ResultSet rs=null;
    Session ses = this.getHibernateTemplate().getSessionFactory().openSession();  
    List ipInfoList=new ArrayList();
        try{    
            Connection cOnn= ses.connection();        
            conn.setAutoCommit(false);    
            String proc="{Call updatepro(?,?,?,?,?)}";    
            CallableStatement st = conn.prepareCall(proc); 
            st.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);//输出参数
            st.setInt(2,Integer.valueOf(curTime.toString())); 
            st.setInt(3,Integer.valueOf(tempNum.toString())); 
            st.setInt(4,Integer.valueOf(dateTime.toString())); 
            st.setInt(5,number);
            
            st.execute();
            rs = (ResultSet) st.getObject(1);
            while(rs.next())

            { IpInfo ipInfo=new IpInfo();
             ipInfo.setIpinfoIpString(PublicClass.getJustIp(rs.getString(2)));
             ipInfo.setMaskLin(rs.getInt(3));
             ipInfo.setPortStart(rs.getInt(4));
             ipInfo.setPortEnd(rs.getInt(5));
             ipInfo.setDir(rs.getInt(6));
             ipInfo.setProperty(rs.getString(7));
             ipInfo.setAuthId(rs.getInt(8));
               
             ipInfoList.add(ipInfo);
             //System.out.println("" +rs.getLong(2)+""+ rs.getInt(3)+rs.getInt(4)+rs.getInt(5)+rs.getInt(6)+rs.getString(7)+rs.getInt(8)+"");
            } 
            
            conn.commit();
            st.close();
            conn.close();
            ses.close();
           
        }catch(Exception e){    
            e.printStackTrace();    
        }
    return ipInfoList;      
    }


推荐阅读
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
author-avatar
小花姐姐
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有