一、临时表
今天看了下临时表,感觉比较容易,没有想象的那么复杂。
-- 会话级别的 Create Global Temporary Table Table_Name ( Col1 Type1,Col2 Type2... ) On Commit Preserve Rows ; -- 其实翻译的也挺人性化的,会话级别的临时表,在提交事务的时候保留行 -- 事务级别的 Create Global Temporary Table Table_Name ( Col1 Type1,Col2 Type2... ) On Commit Delete Rows ; -- 而事务级别的临时表在提交事务的时候删掉行.
我在PL/SQL里面测试的。如果说往第一个临时表里面Insert语句,然后在本窗口中提交事务后,在用SELECT语句查询这个表,仍旧能查到数据。但是如果是第二个表,当点击事务提交之后,SELECT语句就查不到数据量。当然,这两种临时表,都是针对当前连接的,有人说是SESSION的。就是如果新建一个链接,那么无论之前那个窗口的事务是否提交,都SELECT查询不到。
在实际应用中,我看了看有的ERP系统里面,用到基本上是会话级别的。但是还是具体问题具体分析。至于两者的效率,还有待分析。
这里简单提一提ORACLE和SQL Server关于临时表的区别。
1.对于SQL Server来说,可以在表名称前面加上#符号来表示一个类似于Oracle会话级的临时表的功能。
但是,对于SQL Server来说,临时表及临时表的数据在会话结束时(链接释放、Session结束)会同时释放掉;而对于Oracle来说,仅仅是将该链接对应的数据释放掉,而临时表仍旧存放在数据字典中。纠结其原因,SQL Server是内存型数据库,对于频繁的更新删除操作,SQL Server更有些优势,Oracle为了性能的考虑,选择了建立于实际表差不多的这样方式。
2.对于SQL Server 来说,可以在表名称前面加上##符号来表示一个全局的临时表,额,同Oracle的全局不是一个概念。其基本概念就是说,在建立一个带有##的临时表后,在建立该表的用户释放连接之前,除非显示的声明Drop table 之外,其他用户都可以对该表的数据操作,包括Drop table,这点对于Oracle来说,可能就得采用实际表来操作了。
3.对于数据限制方面,Primary key 都支持,foreign key 好像不支持(没咋用过,一般是用主键链接的)
二,游标
引用一个别人的内容,感觉比较全呢。
http://www.cnblogs.com/sc-xx/archive/2011/12/03/2275084.html