示例一html
-- Create table 三目录监控存储过程临时表 create global temporary table L_DIAITEM_ERROR ( forgid NUMBER, --组织机构id forgname VARCHAR2(80), --组织机构名称 nccw NUMBER, --名称错误数 wdz NUMBER --未对照计数 ) on commit delete rows; --事务提交时,清空表数据 --插入一条数据 INSERT INTO L_DIAITEM_ERROR (nccw,wdz) SELECT 1,2 FROM DUAL; --查询该表数据 SELECT * FROM L_DIAITEM_ERROR
示例二java
第一步:建立临时表sql
/** * 建立临时指标表 */ CREATE GLOBAL TEMPORARY TABLE TAB_INDEX_TEMP(A_ID NUMBER,--一级指标ID A_INDEXNAME VARCHAR2(50), --一级指标名称 TOTALWEIGHT NUMBER, --权重占比 B_ID NUMBER, --二级指标ID B_INDEXNAME VARCHAR2(200), ----二级指标名称 INDEXSCORE NUMBER, --指标分值 COUNTER VARCHAR2(200), --计算方法 REMARK VARCHAR2(200)) ON COMMIT DELETE ROWS;/*事务提交时,清空临时表数据*/
第二步:将数据插入临时表数据库
/*将数据批量插入临时表*/ INSERT INTO TAB_INDEX_TEMP SELECT A.ID A_ID, A.INDEXNAME A_INDEXNAME, A.TOTALWEIGHT, B.ID B_ID, B.INDEXNAME B_INDEXNAME, B.INDEXSCORE, B.COUNTER, B.REMARK FROM INDEX_B B, INDEX_A A WHERE A.STATUS = 1 AND B.STATUS = 1 AND B.INDEXTYPE = 2 --二级指标 AND B.INDEXA_ID = A.ID ORDER BY B_ID;
第三步:查询临时表并发
说明:oracle
执行插入语句后,若是没有提交,执行查询语句,该表有数据;工具
若是提交事务,执行查询语句,清空数据;测试
临时表通常和存储过程一块儿使用。spa
详细介绍插件
参考连接:http://www.cnblogs.com/vigarbuaa/archive/2012/06/04/2534797.html
在Oracle8i中,能够建立如下两种临时表:
(1)会话特有的临时表
语法:
CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>) ON COMMIT PRESERVE ROWS;
(2)事务特有的临时表
语法:
CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>) ON COMMIT DELETE ROWS;
举例:
CREATE GLOBAL TEMPORARY TABLE MyTempTable
区别:
ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除所有行,清空表数据)
ON COMMIT PRESERVE ROWS 说明临时表是会话指定,每次中断会话ORACLE将截断表(清空表数据)
做用域:
经过CREATE GLOBAL TEMPORARY TABLE命令建立一个临时表,
对于事务类型的临时表,数据只是在本事务期间存在;对于会话类型的临时表,数据在本会话期间存在。
临时表的特色:
能够对临时表建立索引,视图,触发器,能够用export和import工具导入导出表的定义,可是不能导出数据。表的定义对全部的会话可见。
(1) 多用户操做的独立性:对于使用同一张临时表的不一样用户,ORACLE都会分配一个独立的 Temp Segment,这样就避免了多个用户在对同一张临时表操做时发生交叉,从而保证了多个用户操做的并发性和独立性;
(2) 数据的临时性:既然是临时表,顾名思义,存放在该表中的数据是临时性的。ORACLE根据你建立临时表时指定的参数(On Commit Delete Rows / On Commit Preserve Rows),自动将数据TRUNCATE掉。
2020/04/18
应用场景:在oracle存储过程当中,使用临时表返回数据游标。
会话指定:PRESERVE
在plsql中测试结果以下:
1.若是是会话指定:PRESERVE,存储过程测试窗口运行一次后,未关闭该窗口的状况下,没法删除该临时表;(即便该提交的事务已经提交)
以存储过程当中往临时表中插入数据为例,当存储过程里没有自动提交,且测试窗口也没有手动提交时
2.点击红框左侧按钮执行几回,数据就会插入几回,即便没有提交,只有关闭窗口时,该临时表所对应的会话数据才会消失。
在javaWeb项目中调用该存储过程,以上两点也一样适用,只有关闭程序,会话才算结束,临时表数据才会被清空。
所以,在程序调用存储过程时,不能使用会话指定:PRESERVE,数据库会断定程序始终是同一会话,这样的话,数据只会越查越多,根本不是咱们想要的结果。
若是非得使用这种指定方式的话,须要在存储过程调用该临时表前清空该临时表。
另外,不一样会话以前的临时表数据不是互通的,好比上图所示,A会话里临时表已经有不少数据,当你再打开一个测试窗口进行查询时数据就不会有这么多了。
事物指定:DELETE
在plsql中测试结果以下:
1.在事务提交以前,没法删除该临时表;但事务提交后,就能够删除啦。
2.当存储过程没有自动提交,须要手动提交时,在测试窗口查询多少次,就会插入多少次,只有在提交事务后,该会话中临时表的数据才会消失。
在javaWeb项目中调用该存储过程,就与上面不一样啦:
ibatis插件在执行SQL时会自动执行commit事务,因此,临时表想何时删就何时删掉;
因为程序能够自动提交,因此查询出来的数据永远不存在重复插入这种状况。
另外,事务指定,会话之间也是独立的,当在plsql中执行两次后,该会话已经出现重复数据,此时,使用程序调用一次存储过程,数据依旧不会出现重复的状况。
因此说,使用事务指定,会话之间的临时表数据也是独立的。
另外,事务指定还有一个特性就是:即便你没有提交,直接关闭会话,临时表的数据也会被清空。
最后说一点,当存储过程要返回的数据是含有临时表数据时,则使用事务指定的时候,对于临时表进行新增或修改的操做都不能提交,由于一旦提交临时表数据就会消失。
程序调用的时候也会报错。