|
|
|
|
Blog信息
|
blog名称:四裤全输的小窝~~ 日志总数:178 评论数量:699 留言数量:198 访问次数:1154211 建立时间:2005年10月29日 | |
|
|
|
|
 |
|
|
|
|
[database][转]Oracle关于临时表的操作
文章收藏, 网上资源, 软件技术, 电脑与网络 四裤全输 发表于 2006/8/2 13:06:58
|
对全局临时表的总结在临时表上的操作比在一般的表上的操作要快。因为:1创建临时表不需要往编目表中插入条目,临时表的使用也不需要访问编目表,因此也没有对编目表的争用。2仅有创建临时表的app才可存取临时表,所以在处理临时表时没有锁。3如果指定NOT LOGGED选项,在处理临时表时不记日志。所以如果有仅在数据库的一个会话中使用的大量临时数据,把这些数据存入临时表能大大提高性能。DECLARE GLOBAL TEMPORARY TABLE TT(C1 INT, C2 CHAR(20));在CONNECT RESET命令后,临时表不再存在。建临时表是动态编译的,所以对临时表的使用也必须放在DECLARE CURSER 后面CREATE PROCEDURE INSTT2(P1 INT, P2 CHAR(20))BEGIN DECLARE GLOBAL TEMPORARY TABLE TT(C1 INT, C2 CHAR(20)) % INSERT INTO SESSION.TT VALUES(P1, P2); BEGIN DECLARE C1 CURSOR WITH RETURN FOR SELECT * FROM SESSION.TT; END;END %2。事务特有的临时表 CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>) ON COMMIT DELETE ROWS;
在Oracle中,全局临时表并不会删除,实际上你只需要建立一次,以后直接应用就行了,这与MS和Sybase不一样。实际上在断开数据库连接时,临时
表中数据自动清空,不同的Session之间是隔离的,不许要当心相互影响,不过如果起用了连接共享的话,你要用On Commit delete
rows使数据仅在事物内部有效。zt不同:1.SQL SERVER临时表是一种”内存表”,表是存储在内存中的.ORACLE临时表除非执行DROP TABLE,否则表定义会保留在数据字典中.2.SQL SERVER临时表不存在类似ORACLE临时表 事务级别 上的功能.3SQL SERVER本地临时表(#) 与 ORACLE的会话级别临时表类似,但是在会话退出的时候,ORACLE不会删除表.4SQL SERVER的全局临时表(##) 是指多个连接共享同一片内存.当没有指针引用该内存区域时,SQL SERVER自动释放全局临时表.5由于ORACLE不是一种 内存中的数据库. 所以如果ORACLE类似SQL SERVER 频繁的对临时表进行建立和删除,必定会影响性能.所以ORACLE会保留临时表的定义直到用户DROP TABLE.6
在ORACLE中,如果需要多个用户共享一个表(类似SQL
SERVER的全局临时表##).则可以利用永久表,并且在表中添加一些可以唯一标识用户的列.利用触发器和视图.当用户退出的时候,根据该登陆用户的唯
一信息删除相应的表中的数据. 这种方法给ORACLE带来了一定量的负载.是TEMPORARY CREATE GLOBAL TEMPORARY TABLE flight_schedule ( startdate DATE, enddate DATE, cost NUMBER) --------------------------------------------------------------- create proecdure name_pro as str varchar2(100); begin str:='CREATE GLOBAL TEMPORARY TABLE TABLENAME ON COMMIT PRESERVE ROWS as select * from others_table'; execute immediate str; end; /testCREATE OR REPLACE PROCEDURE p_ll ISstrsql varchar2(1000);BEGIN strsql :='CREATE GLOBAL TEMPORARY TABLE tmp_ll01 ' || '(CTRL_ENT_ID VARCHAR2(100),COL_ENT_ID VARCHAR2(100),updateable INTEGER,ENABLED INTEGER,VISIBLE INTEGER' || ',INSERTABLE INTEGER,deleteable INTEGER,CHANGEABLE INTEGER) on commit preserve rows'; EXECUTE IMMEDIATE strsql; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN OTHERS THEN -- Consider logging the error and then re-raise RAISE;END p_ll;/beginp_ll();end;--正确执行---------------------------------------------------OTHER:zt需要创建一个临时表,请举例说明,谢谢! --------------------------------------------------------------- 是TEMPORARY CREATE GLOBAL TEMPORARY TABLE flight_schedule ( startdate DATE, enddate DATE, cost NUMBER) --------------------------------------------------------------- create proecdure name_pro as str varchar2(100); begin str:='CREATE GLOBAL TEMPORARY TABLE TABLENAME ON COMMIT PRESERVE ROWS as select * from others_table'; execute immediate str; end; /可以把临时表指定为事务相关(默认)或者是会话相关:ON COMMIT DELETE ROWS:指定临时表是事务相关的,Oracle在每次提交后截断表。ON COMMIT PRESERVE ROWS:指定临时表是会话相关的,Oracle在会话中止后截断表。=================可以创建以下两种临时表:1。会话特有的临时表 CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>) ON COMMIT PRESERVE ROWS;========对全局临时表的总结在临时表上的操作比在一般的表上的操作要快。因为:1创建临时表不需要往编目表中插入条目,临时表的使用也不需要访问编目表,因此也没有对编目表的争用。2仅有创建临时表的app才可存取临时表,所以在处理临时表时没有锁。3如果指定NOT LOGGED选项,在处理临时表时不记日志。所以如果有仅在数据库的一个会话中使用的大量临时数据,把这些数据存入临时表能大大提高性能。DECLARE GLOBAL TEMPORARY TABLE TT(C1 INT, C2 CHAR(20));在CONNECT RESET命令后,临时表不再存在。建临时表是动态编译的,所以对临时表的使用也必须放在DECLARE CURSER 后面CREATE PROCEDURE INSTT2(P1 INT, P2 CHAR(20))BEGIN DECLARE GLOBAL TEMPORARY TABLE TT(C1 INT, C2 CHAR(20)) % INSERT INTO SESSION.TT VALUES(P1, P2); BEGIN DECLARE C1 CURSOR WITH RETURN FOR SELECT * FROM SESSION.TT; END;END %2。事务特有的临时表 CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>) ON COMMIT DELETE ROWS;
在Oracle中,全局临时表并不会删除,实际上你只需要建立一次,以后直接应用就行了,这与MS和Sybase不一样。实际上在断开数据库连接时,临时
表中数据自动清空,不同的Session之间是隔离的,不许要当心相互影响,不过如果起用了连接共享的话,你要用On Commit delete
rows使数据仅在事物内部有效。zt3建立临时表 临时表的定义对所有会话SESSION都是可见的,但是表中的数据只对当前的会话或者事务有效. 建立方法:1) ON COMMIT DELETE ROWS 定义了建立事务级临时表的方法.CREATE GLOBAL TEMPORARY TABLE admin_work_area (startdate DATE, enddate DATE, class CHAR(20)) ON COMMIT DELETE ROWS;EXAMPLE:SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area 2 (startdate DATE, 3 enddate DATE, 4 class CHAR(20)) 5 ON COMMIT DELETE ROWS;SQL> create table permernate( a number);SQL> insert into admin_work_area values(sysdate,sysdate,'temperary table');SQL> insert into permernate values(1);SQL> commit;SQL> select * from admin_work_area;SQL> select * from permernate; A12)ON COMMIT PRESERVE ROWS 定义了创建会话级临时表的方法.CREATE GLOBAL TEMPORARY TABLE admin_work_area (startdate DATE, enddate DATE, class CHAR(20)) ON COMMIT PRESERVE ROWS;EXAMPLE:会话1:SQL> drop table admin_work_area;SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area 2 (startdate DATE, 3 enddate DATE, 4 class CHAR(20)) 5 ON COMMIT PRESERVE ROWS;SQL> insert into permernate values(2);SQL> insert into admin_work_area values(sysdate,sysdate,'session temperary');SQL> commit;SQL> select * from permernate; A---------- 1 2SQL> select * from admin_work_area;STARTDATE ENDDATE CLASS---------- ---------- --------------------17-1ÔÂ -03 17-1ÔÂ -03 session temperary会话2:SQL> select * from permernate; A---------- 1 2SQL> select * from admin_work_area; 未选择行.会话2看不见会话1中临时表的数据.
|
阅读全文(4527) | 回复(1) | 编辑 | 精华 |
|
|
|
|
|
|
» 1 »
|