- 浏览: 35583 次
- 性别:
- 来自: 天津
最新评论
参考资料
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 创建临时表
- create global temporary table 表名
- (
- ID VARCHAR2(100 CHAR),
- NAME VARCHAR2(100 CHAR)
- )
- on commit preserve rows;
2 创建存储过程
- create or replace procedure proc_XXX(
- mycur out SYS_REFCURSOR
- as
- TYPE My_CurType IS REF CURSOR;
- CUR_1 My_CurType;
- tempa varchar2;
- tempb varchar2;
- --此处可声明更多变更^_^
- begin
- OPEN CUR_1 FOR select * from 表名;
- --使用前先清空
- execute immediate 'truncate table 临时表表名';
- LOOP
- FETCH CUR_1 INTO tempa;
- EXIT WHEN CUR_1%NOTFOUND;
- --进行相关的业务查询,将结果返回于更多变量上,插入临时表数据
- tempa:='1';
- tempb:='jack';
- insert into 临时表表名(ID,NAME)values(tempa,tempb);
- commit;
- end loop;
- open mycur for select * from 临时表表名;
- CLOSE CUR_1;
- message :='查询临时表成功';
- EXCEPTION
- WHEN OTHERS THEN
- message :='查询临时表失败';
- end proc_XXX;
参考更多
1 创建临时表,插入数据,返回结果集
- CREATE OR REPLACE PROCEDURE Report_Month_Responsibility(
- o_cur OUT SYS_REFCURSOR
- )
- IS
- STR VARCHAR2(200);
- tb_count INT;
- BEGIN
- --先判断全局临时表是否存在,没存在则重新建立:
- select count(*) into tb_count from dba_tables where table_name='REPROTTEST';
- if tb_count=0 then
- STR:=' CREATE GLOBAL TEMPORARY TABLE REPROTTEST(
- ID INT,
- ANAME VARCHAR2(20)
- ) ON COMMIT PRESERVE ROWS';
- execute immediate STR;
- end if;
- STR:='INSERT INTO REPROTTEST(ID,ANAME) VALUES(1,''1'')';
- execute immediate STR;
- COMMIT;
- STR:='SELECT * FROM REPROTTEST';
- OPEN o_cur FOR STR; -- 给游标变量赋值
- END Report_Month_Responsibility;
2 调用存储过程
- CREATE OR REPLACE PROCEDURE proc_X()
- IS
- v_ID INT;
- v_ANAME VARCHAR2(20);
- --定义游标:
- v_account_cur SYS_REFCURSOR;
- BEGIN
- --调用存储过程:
- Report_Month_Responsibility(v_account_cur);
- fetch v_account_cur into v_ID,v_ANAME;
- --用循环显示游标中的记录:
- while v_account_cur%found loop
- dbms_output.put_line('The value of column ID is: '||v_ID);--打引列ID
- dbms_output.put_line('The value of column ANAME is: '||v_ANAME);
- --打引列ANAME
- fetch v_account_cur into v_ID,v_ANAME;
- end loop;
- close v_account_cur;
- execute immediate 'truncate TABLE REPROTTEST';
- end proc_X;
-
解决一个上周很郁闷的问题:
项目中有一个需求,一个表 数据量很大,有几百万条吧,保守估计,呵呵。页面上填入 每组 要显示的个数,租用时间(以秒为单位),逻辑就是我先分组,然后循环 每组里根据填入的个数查询出相应的数据,这些数据要写入到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("<tr><td>" +rs.getLong(2)+"</td><td>"+ rs.getInt(3)+rs.getInt(4)+rs.getInt(5)+rs.getInt(6)+rs.getString(7)+rs.getInt(8)+"</td><td>");
}
conn.commit();
st.close();
conn.close();
ses.close();
}catch(Exception e){
e.printStackTrace();
}
return ipInfoList;
}
发表评论
-
ORA-01578(数据块损坏)错误解决方法
2012-08-17 16:30 2207错误:在 exp 时出现以下错误: EXP-00056: 遇 ... -
oracle 只有数据文件时的恢复
2012-08-17 15:26 2697兄弟刚用ORACLE,因为IP地址变了下,玩了半天, ... -
ORACLE中NOT IN 的替代
2012-08-07 14:01 989典型的查询方式为:SELECT TITLEFROM BO ... -
Oracle10g JDBC ojdbc14 DATE类型hibernate查询时分秒问题(纠结困扰了半天,汗)
2012-04-16 10:46 1677一般的数据库中,DATE字段仅仅表示日期,不包括日期信息,而O ... -
删除Oracle中奇怪的表名称BIN$…的方法
2012-04-02 17:07 1073从Oracle10g开始删除数据库表的时候并不是真正删除 ... -
oracle添加列到指定位置
2012-04-02 16:29 2826oracle中,1.如果表已经装载了大量数据应该是用视图 ... -
存储过程还是业务逻辑层
2012-02-25 20:55 12911.存储过程是基于计算密集型的业务逻辑。如果是基于操作密集型的 ... -
连接oracle 报 ORA-12519
2012-02-24 13:20 2581TNS-12519与processes参 ... -
oracle no appropriate service handler found ORA-12519
2012-01-11 11:14 976今天下午,开发人员突然说不能连接数据库了,提示相关的 ...
相关推荐
本篇文章将深入探讨如何使用Java调用Oracle存储过程,并通过游标获取存储过程中返回的临时表数据。 首先,Oracle存储过程是一种在数据库端执行的预编译SQL语句和PL/SQL代码集合。它可以接收参数、执行业务逻辑并...
在本示例中,我们将探讨如何使用Oracle数据库、Hibernate ORM框架以及Uploadify插件处理Blob类型的大数据,如图片或文件上传。Blob(Binary Large Object)是数据库中用于存储二进制大对象的类型,常用于存储图片、...
- `CREATE USER`用于创建新用户,`IDENTIFIED BY`指定用户密码,`DEFAULT TABLESPACE`定义用户的默认表空间,`TEMPORARY TABLESPACE`为临时表空间,最后通过`GRANT`语句赋予必要的权限。 **4. 登录创建的用户** ...
4. **Session**:Hibernate的核心接口,用于在应用程序和数据库之间提供临时的、线程安全的工作单元,负责对象的持久化操作。 5. **SessionFactory**:为应用创建Session的工厂,负责初始化Hibernate配置,并在整个...
每个表空间都有其特定的目的,例如系统表空间、临时表空间或用户自定义表空间。 #### 二、创建表空间 根据提供的 SQL 语句,我们可以看到创建表空间的基本语法结构: ```sql CREATE TABLESPACE news_tablespace ...
在开发Java Web应用程序时,有时会遇到中文数据在Hibernate与Oracle数据库交互时出现乱码的问题。这通常是由于字符集不匹配或处理方式不当所引起的。本文将深入探讨这个问题,并提供解决方案。 首先,我们需要理解...
Hibernate是一个流行的Java对象关系映射(ORM)框架,它简化了在Java应用程序中处理数据库的过程。通过提供一种在Java对象和数据库表之间建立映射的方式,Hibernate使得开发者无需编写大量的SQL代码,就能进行数据...
Java对象持久化技术是将Java对象的数据存储到数据库中的过程。在传统的JDBC方式下,这通常涉及到大量的SQL编写和结果集处理。而Hibernate通过映射机制,将Java对象与数据库表关联,使得对象可以直接保存、查询和更新...
根据题目提供的信息,“内存是暂时存储设备,断电后数据易丢失”,这揭示了内存作为临时存储空间的局限性。此外,“网络传输无法传输内存中的对象,需要将对象序列化”说明了在分布式系统或网络应用中,内存中的数据...
7. **缓存管理**:Hibernate支持一级缓存和二级缓存,用于存储临时和长期的数据。 #### 七、Hibernate in Spring 在实际项目中,Hibernate经常与Spring框架一起使用,以实现更好的集成和管理。这种集成模式可以...
在Java世界中,Hibernate是一款极为重要的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者可以更加专注于业务逻辑而不是底层的数据存储。本指南将深入探讨Hibernate的核心概念和常见应用场景,帮助...
Session内部管理着一级缓存,用于存储临时的对象,提高性能。 3. **Transaction**:Hibernate使用Transaction来处理数据库事务,确保数据的一致性和完整性。事务管理是数据库操作的关键部分,它确保一组操作要么...
- 对象持久化是指将内存中的对象状态保存到磁盘等持久性存储介质的过程。 - 对象持久化的主要目的是解决内存数据的易失性和安全性问题,同时提供一种高效的数据管理和查询方式。 2. **为什么需要对象持久化**: -...
4. **存储过程移植性差**:由于存储过程通常是特定于某个数据库系统的,因此其可移植性较差。 5. **非面向对象开发**:JDBC直接操作数据库,缺乏面向对象的封装特性。 #### Hibernate 优势 相比JDBC,Hibernate...
### Hibernate常用注解详解 ...通过这些注解的应用,Hibernate能够自动管理实体对象与数据库表之间的映射,极大地简化了数据访问层的开发工作。理解和熟练掌握这些注解对于使用Hibernate进行持久化操作至关重要。
Session内部维护了一个一级缓存,用于临时存储已加载的对象。 3. Query与Criteria API:这两个API提供了执行数据库查询的方式,Query基于HQL(Hibernate查询语言),Criteria API则提供了一种类型安全的查询方式。 ...
- **解决方案二**:为每张表创建特定的构造函数,根据需要的字段生成临时Bean对象。 3. **Session.load()与Session.get()的区别** - **Session.load()**:当找不到匹配记录时抛出ObjectNotFoundException,能返回...
Hibernate将Java对象与数据库表之间的映射关系配置在XML文件中,从而实现了数据的透明化访问。开发者可以通过Hibernate API直接操作对象,无需关心底层SQL的生成与执行,大大提高了开发效率。 【手机销售系统用户子...
在超市收银系统的上下文中,集合可以用于临时存储购物车中的商品、顾客信息等,但若要永久保存数据,我们需要引入数据库技术。数据库系统如MySQL、Oracle、SQL Server或NoSQL数据库(如MongoDB、Redis)可以提供数据...
新华书店销售分析系统选择了Oracle作为数据库管理系统,包含了6个核心表格:上传销售临时信息表、图书基本资料表、出版社基本信息表、销售表、用户表和配货表。这些表格构成了系统的数据基础,用于存储和管理各种...