- 浏览: 468252 次
- 性别:
- 来自: 青岛
文章分类
最新评论
-
此去经年雪123:
为啥生成的是乱码 你好
关于使用JS前台加密、JAVA后台解密的RSA实现,RSA加密和签名 -
alonglw:
zxf0089216 写道1.为什么每次都是10001RSAK ...
关于使用JS前台加密、JAVA后台解密的RSA实现,RSA加密和签名 -
zxf0089216:
1.为什么每次都是10001RSAKeyPair(" ...
关于使用JS前台加密、JAVA后台解密的RSA实现,RSA加密和签名 -
dunhanson:
后台的测试main方法都能加密解密。前台加密后的密文交给后台解 ...
关于使用JS前台加密、JAVA后台解密的RSA实现,RSA加密和签名 -
map612:
wula0010 写道仔细看了下,可以运行RSAUtil.ma ...
关于使用JS前台加密、JAVA后台解密的RSA实现,RSA加密和签名
一、Oracle临时表知识
在Oracle中,临时表分为SESSION、TRANSACTION两种,SESSION级的临时表数据在整个SESSION都存在,直到结束此次SESSION;而 TRANSACTION级的临时表数据在TRANACTION结束后消失,即COMMIT/ROLLBACK或结束SESSION都会清除 TRANACTION临时表数据。
1) 会话级临时表
示例
1创建
create global temporary table temp_tbl(col_a varchar2(30)) on commit preserve rows
2插入数据
insert into temp_tbl values('test session table')
3提交
commit;
4查询
select *from temp_tbl
可以看到数据'test session table'记录还在。
结束SESSION,重新登录,再查询数据select *from temp_tbl,这时候记录已不存在,因为系统在结束SESSION时自动清除记录 。
2) 事务级临时表
示例
1创建
create global temporary table temp_tbl(col_a varchar2(30)) on commit delete rows
2插入数据
insert into temp_tbl values('test transaction table')
3提交
commit ;
4查询
select *from temp_tbl
这时候可以看到刚才插入的记录'test transaction table'已不存在了,因为提交时已经晴空了数据库;同样,如果不提交而直接结束SESSION,重新登录记录也不存在 。
二、在Oracle存储中使用临时表的一个例子
描述:档案册借阅时,需要把册拆分成详细的单据,拆分依据是册表中的BILLCODES(若干个用逗号分割的单据号)字段,临时表用于保存拆分出来的单据信息。拆分结束后直接返回临时表的数据。
create or replace package AMS_PKG as type REFCURSORTYPE is REF CURSOR; procedure SPLIT_VOLUMES (P_CORP_NAME IN varchar2,P_YEAR IN varchar2,P_MONTH IN varchar2,P_VOL_TYPE_CODE IN varchar2,P_BILL_NUM IN varchar2,P_VOLUME_NUM IN varchar2,P_AREA_CODES IN varchar2,P_QUERY_SQL out varchar2,P_OUTCURSOR out refCursorType); end AMS_PKG; / CREATE OR REPLACE PACKAGE BODY "AMS_PKG" as procedure SPLIT_VOLUMES(p_CORP_NAME IN varchar2, --查询条件,公司名称 p_YEAR IN varchar2, --查询条件,会计年度 p_MONTH IN varchar2, --查询条件,期间 p_VOL_TYPE_CODE IN varchar2, --查询条件,凭证类别编码 p_BILL_NUM IN varchar2, --查询条件,信息单号 p_VOLUME_NUM IN varchar2, --查询条件,册号 p_AREA_CODES IN varchar2, --查询条件,所在区域编码(产生册的区域),逗号分割。 --形式如 '12C01','12201','12D01','12E01','12601',存储过程中将使用in的方式进行过滤 p_QUERY_SQL out varchar2, --返回查询字符串 p_OutCursor out refCursorType --返回值 ) is v_sql varchar2(3000); v_sql_WHERE varchar2(3000); v_temp1 varchar2(300); v_temp2 varchar2(300); v_tempBILLCODES varchar2(3000); V_CNT NUMBER(10,0); V_VOLUME_ID NUMBER(10,0); mycur refCursorType; --CURSOR mycur( v varchar2) is -- SELECT VOUCHTYPE,BILLCODES FROM PUB_VOLUMES where volumeid=v; CURSOR mycur_split( val varchar2,splitMark varchar2) is select * from table(myutil_split(val,splitMark)); begin v_temp1 :=''; v_temp2 :=''; v_sql_WHERE := ''; v_tempBILLCODES := ''; V_CNT := 0; V_VOLUME_ID := 0;--册表的系统编号 v_sql := 'SELECT VOLUMEID,VOUCHTYPE,BILLCODES FROM PUB_VOLUMES WHERE 1=1 '; --dbms_output.put_line('p_BILL_NUM='||p_BILL_NUM); IF (p_CORP_NAME IS NOT NULL AND LENGTH(p_CORP_NAME) >0) THEN --公司名称 BEGIN v_sql_WHERE := v_sql_WHERE || ' AND CORPNAME LIKE ''%'; v_sql_WHERE := v_sql_WHERE || p_CORP_NAME; v_sql_WHERE := v_sql_WHERE || '%'''; --dbms_output.put_line(p_BILL_NUM); END; END IF; IF (p_YEAR IS NOT NULL AND LENGTH(p_YEAR) >0) THEN --会计年度 BEGIN v_sql_WHERE := v_sql_WHERE || ' AND YEAR = '''; v_sql_WHERE := v_sql_WHERE || p_YEAR; v_sql_WHERE := v_sql_WHERE || ''''; --dbms_output.put_line(p_BILL_NUM); END; END IF; IF (p_MONTH IS NOT NULL AND LENGTH(p_MONTH) >0) THEN --期间 BEGIN v_sql_WHERE := v_sql_WHERE || ' AND MONTH = '''; v_sql_WHERE := v_sql_WHERE || p_MONTH; v_sql_WHERE := v_sql_WHERE || ''''; --dbms_output.put_line(p_BILL_NUM); END; END IF; IF (p_VOL_TYPE_CODE IS NOT NULL AND LENGTH(p_VOL_TYPE_CODE) >0) THEN --凭证类别编码 BEGIN v_sql_WHERE := v_sql_WHERE || ' AND VOUCHTYPE = '''; v_sql_WHERE := v_sql_WHERE || p_VOL_TYPE_CODE; v_sql_WHERE := v_sql_WHERE || ''''; --dbms_output.put_line(p_BILL_NUM); END; END IF; IF (p_BILL_NUM IS NOT NULL AND LENGTH(p_BILL_NUM) >0) THEN --信息单号 BEGIN v_sql_WHERE := v_sql_WHERE || ' AND BILLCODES LIKE ''%'; v_sql_WHERE := v_sql_WHERE || p_BILL_NUM; v_sql_WHERE := v_sql_WHERE || '%'''; --dbms_output.put_line(p_BILL_NUM); END; END IF; IF (p_VOLUME_NUM IS NOT NULL AND LENGTH(p_VOLUME_NUM) >0) THEN --册号 BEGIN v_sql_WHERE := v_sql_WHERE || ' AND VOLUMENUM = '''; v_sql_WHERE := v_sql_WHERE || p_VOLUME_NUM; v_sql_WHERE := v_sql_WHERE || ''''; --dbms_output.put_line(p_BILL_NUM); END; END IF; p_QUERY_SQL := 'SQL4WHERE: ' || v_sql_WHERE; --dbms_output.put_line(v_sql || v_sql_WHERE || p_BILL_NUM); --OPEN mycur(v_WHERE); OPEN mycur FOR v_sql || v_sql_WHERE; LOOP--循环册记录 fetch mycur INTO V_VOLUME_ID,v_temp1,v_tempBILLCODES ; EXIT WHEN mycur%NOTFOUND; V_CNT := V_CNT + 1 ; --DBMS_OUTPUT.PUT_LINE( V_CNT || ':BILLCODES = ' || v_tempBILLCODES); OPEN mycur_split(v_tempBILLCODES,','); LOOP--循环生成每一个册的单据记录 fetch mycur_split INTO v_temp2 ; EXIT WHEN mycur_split%NOTFOUND; --DBMS_OUTPUT.PUT_LINE(' ' || v_temp2); --DBMS_OUTPUT.PUT_LINE(' p_BILL_NUM= ' || p_BILL_NUM||',v_temp2='||v_temp2); IF (p_BILL_NUM IS NULL OR p_BILL_NUM = TO_NUMBER(v_temp2)) THEN v_temp1 := 'INSERT INTO TEMP_VOLUMES_QUERY (SELECT '''|| v_temp2 || ''',A.* FROM PUB_VOLUMES A WHERE volumeid = ' || V_VOLUME_ID || ')';--写入到临时表 --dbms_output.put_line( 'v_temp1=' || v_temp1); execute immediate v_temp1; END IF; END LOOP; CLOSE mycur_split; END LOOP; CLOSE mycur; --开始输出结果 v_sql := 'SELECT CE.DCODE,CE.VOLUMEID,CE.CORPCODE,CE.CORPNAME,QU.AREANAME,CE.YEAR,CE.MONTH,CE.BILLCODES,CE.VOUCHTYPE,SHI.ROOMNAME, '; v_sql := v_sql || 'CE.VOLUMENUM,GUI.CABINETNUM,CE.CABINETLAYER FROM TEMP_VOLUMES_QUERY CE '; v_sql := v_sql || 'LEFT OUTER JOIN PUB_CORPS NAME ON CE.CORPCODE = NAME.CORPCODE ';--册所属公司(产生单据的公司) v_sql := v_sql || 'LEFT OUTER JOIN PUB_AREAS QU ON NAME.AREACODE=QU.AREACODE ';--册所属区域(产生单据的公司所在区域) v_sql := v_sql || 'LEFT OUTER JOIN PUB_CABINETS GUI ON CE.CABINETCODE=GUI.CABINETCODE ';--册所在档案柜(保存的位置) v_sql := v_sql || 'LEFT OUTER JOIN PUB_ARCHIVESROOMS SHI ON GUI.ROOMCODE = SHI.ROOMID ';--册(柜)所在档案室(保存的位置) v_sql := v_sql || 'WHERE (GUI.ISMAIL = 0 OR GUI.ISSIGN = 1) ';--尚未邮寄的或者已签收的 v_sql := v_sql || 'AND CE.ISBORROW = ''0'' ';--尚未借出去的 IF (p_AREA_CODES IS NOT NULL AND LENGTH(p_AREA_CODES) >0) THEN --如果需要限制册的所属区域 BEGIN v_sql := v_sql || 'AND QU.AREACODE IN ('|| p_AREA_CODES || ') '; END; END IF; p_QUERY_SQL := p_QUERY_SQL || ' SQL4RESULT: ' || v_sql;--返回 OPEN p_OutCursor FOR v_sql; SELECT COUNT(1) INTO V_CNT FROM TEMP_VOLUMES_QUERY; dbms_output.put_line(v_sql || ',V_CNT=' || V_CNT); dbms_output.put_line(V_CNT); delete from TEMP_VOLUMES_QUERY; COMMIT; end SPLIT_VOLUMES; end; /
三、结论
1、ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)
2、ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当中断会话时ORACLE将截断表。
3、临时表(无论会话级还是事务级)中的数据都是会话隔离的,不同session之间不会共享数据。
4、在存储中使用事务级临时表时,注意commit前删除掉本事务的数据,否则可能会出现数据不断增加的情况(原因尚未搞明白)。
5、
两种临时表的语法:
create global temporary table 临时表名 on commit preserve|delete rows;
用preserve时就是SESSION级的临时表,
用delete就是TRANSACTION级的临时表。
6、特性和性能(与普通表和视图的比较)
临时表只在当前连接内有效;
临时表不建立索引,所以如果数据量比较大或进行多次查询时,不推荐使用;
数据处理比较复杂的时候时表快,反之视图快点;
在仅仅查询数据的时候建议用游标: open cursor for 'sql clause';
发表评论
-
Oracle 百万行数据查询优化
2011-08-31 13:16 15171.对查询进行优化, ... -
【转载】ORACLE误删数据的恢复
2011-03-18 22:29 1750一、利用SCN恢复 ... -
利用数据库将字符串分割成Table函数
2011-03-14 15:54 16161、Oracle中 创建代码: create or rep ... -
oracle10如何查出历史记录中执行效率低的SQL语句
2011-03-01 18:56 2782解决oracle10g运行慢、 ... -
Oracle、SqlServer、MySql临时表小结
2011-01-22 12:04 24981、Oracle临时表 Oracle临时表分为两种 ... -
[转]Oracle的JDBC驱动的版本你了解吗?
2010-11-17 15:31 1042在使用Oracle JDBC驱动时,有些问题你是 ... -
(转)Oracle中PFILE和SPFILE的使用
2010-10-28 08:50 2565在9i以前,Oracle使用pfile存储初 ... -
关于Oracle10.2.0自行启动两个监听进程导致服务中断问题
2010-09-01 16:12 3187环境: AIX6.1 Oracle Database ... -
笔记:查看Oracle表空间使用率的sql
2010-07-14 17:41 1964SELECT UPPER(F.TABLESPACE ... -
Oracle中如何使用DBLink连接不同的实例
2010-05-22 10:06 4440实际生产过程中,通常会遇到不同数据库之间进行数据交换的问题,有 ... -
Oracle10g只有数据文件的恢复方式
2010-03-22 14:42 2388待完成。 1、首先安装一个全新的ORACLE,包 ... -
一个Oracle分页的存储过程
2010-02-03 16:54 1457Oracle下通用的分页脚本: CREATE OR R ... -
Oracle用户锁定/解锁
2009-12-28 09:40 3262解锁/锁定命令 ALTER USER ECODE ACCOU ... -
如何查看Oracle某时刻的客户端连接情况并显示客户端IP
2009-12-18 15:18 139581、查看每个oracle帐 ... -
深入浅出理解索引结构
2009-10-24 20:31 886深入浅出理 ... -
ORACLE单行函数
2009-10-24 09:15 1863可以作下列事情: 描述SQL中 ... -
Oracle修改存储空间相关sql
2009-09-23 11:23 14531、查看表空间情况: ... -
Linux下Oracle10g不能启动之 could not open parameter file
2009-08-19 18:00 5927今天开发服务器突然连接不上,sqlplus /nolog、co ... -
Oracle的分区管理
2009-06-12 15:53 1042一、 分区概述: 为了简化数据库大表的管理,ORA ... -
Oracle创建索引 小贴士
2009-06-12 15:46 2715索引( Index )是常见的数 ...
相关推荐
本篇文章将深入探讨如何使用Java调用Oracle存储过程,并通过游标获取存储过程中返回的临时表数据。 首先,Oracle存储过程是一种在数据库端执行的预编译SQL语句和PL/SQL代码集合。它可以接收参数、执行业务逻辑并...
文章中使用了dbms_output.put_line来输出调试信息,这在调试存储过程时非常有用。同时,存储过程可以通过异常处理语句来捕获并处理可能发生的异常情况。 综上所述,Oracle存储过程学习总结提供了一套存储过程编写和...
本文将深入探讨如何在Oracle存储过程中使用游标进行多表操作,具体通过一个示例来展示这一过程。 ### 标题与描述分析 标题:“oracle存储过程使用游标对多表操作例子”直接指出了文章的主题是关于在Oracle环境下,...
`ON COMMIT PRESERVE ROWS` 选项确保了即使在事务提交后,临时表中的数据仍保留,直到会话结束。另外,还可以选择 `ON COMMIT DELETE ROWS`,这样在事务提交时,所有行都将被删除。 在存储过程中使用临时表,我们...
局部临时表是一种只能在一个会话中使用的临时表,当会话结束时,所有的数据都会被自动删除。下面是如何创建一个局部临时表的例子: ```sql CREATE LOCAL TEMPORARY TABLE TempTable (id NUMBER, name VARCHAR2(50))...
Oracle中的临时表是一种特殊的数据结构,用于存储会话或事务期间的数据,这些数据仅对当前会话可见,并在特定条件下自动清除。Oracle提供两种类型的临时表:事务型和会话型。 事务型临时表在事务开始时创建,插入的...
1. **会话级临时表**:这类临时表中的数据仅在当前会话期间有效。当会话结束时,临时表中的所有数据会被自动清除。 2. **事务级临时表**:这类临时表中的数据仅在一个事务期间有效。当事务提交或回滚后,临时表中的...
Oracle 临时表用法 Oracle 临时表是一种特殊的表结构,它可以在数据库中临时存储...但是,使用临时表时需要注意一些问题,例如避免在存储过程中创建临时表,避免在运行时创建临时表,以免导致数据库中的表数量增加。
### Oracle存储过程使用知识点 #### 一、存储过程概述 - **定义**:存储过程(Stored Procedure)是在数据库中预编译的一组SQL语句集合,它可以被当作一个单独的对象来调用,只需要指定存储过程的名字及参数(如果...
在临时表中保存的数据只有对当前会话是可见的,任何会话都不能看到其他会话的数据,即使在当前会话 COMMIT 数据以后也是不可见的。多用户并行不是问题,一个会话从来不阻塞另一个会话使用临时表。临时表比正常表产生...
本文将详细解析一个特定的Oracle函数——`NS_DNAF_GetPaidUpDeposit`,该函数旨在执行查询操作,并将结果插入到一个临时表中。通过分析该函数的结构、参数以及执行逻辑,我们可以更好地理解其工作原理及其应用场景。...
Oracle 提供了多种方法实现分页查询,下面我们将详细探讨Oracle存储过程中的分页实现。 1. **ROWNUM伪列** 在早期的Oracle版本中,ROWNUM伪列被广泛用于分页。ROWNUM是在结果集生成时自动分配的,表示每一行的顺序...
在Oracle数据库系统中,表空间(Tablespace)是存储数据对象(如表、索引、视图等)的逻辑单位,而临时表空间(Temporary Tablespace)则用于存储临时数据,比如排序或联接操作产生的中间结果。创建和管理表空间及...
Oracle 临时表空间满是指数据库中的临时表空间达到最大容量,无法继续存储临时数据,影响数据库的正常运行。本文将详细介绍解决 Oracle 临时表空间满的问题的步骤。 第一步:查看当前数据库的默认临时表空间 在解决...
### Oracle存储过程的基本语法知识点详解 #### 一、Oracle存储过程概述 Oracle存储过程是一种预编译的SQL脚本集合,它可以包含复杂的控制流逻辑、数据处理操作等,并且能够被其他应用程序或用户通过简单的调用来...
根据提供的Oracle存储过程示例,我们可以详细解析其中的关键知识点,包括存储过程的创建、游标的使用、临时表的创建及数据处理等。 ### 存储过程的创建与使用 存储过程是在数据库中编写的SQL代码块,它可以接受...
Oracle存储过程是数据库管理系统Oracle中的一种重要特性,它允许开发者编写和存储PL/SQL代码,以便在需要时高效地执行。存储过程具有多种优势,包括提高性能、减少网络流量、增强安全性和简化复杂的数据库操作。 1....
CLOB变量需要dbms_lob.createtemporary,临时表空间中,建立临时LOB。 大数据量,返回值虽然是CLOB,依然会报错; CLOB变量需要dbms_lob.createtemporary,临时表空间中,建立临时LOB。 大数据量,返回值虽然是CLOB...
"Oracle存储过程游标详解" Oracle 存储过程游标是指在 Oracle 数据库中使用游标来实现对结果集的处理和操作。游标可以分为静态游标和REF游标两种类型。静态游标是指结果集已经确实(静态定义)的游标,可以进一步...