临时表保存仅在事务或会话期间存在的数据 。
临时表中的数据是会话私有的。每个会话只能查看和修改自己的数据。
可以创建全局临时表或私有临时表。下表显示了它们之间的本质区别。
Temporary Table Characteristics
Characteristic | Global | Private |
Naming rules | Same as for permanent tables与永久表相同 | Must be prefixed with |
Visibility of table definition | All sessions | Only the session that created the table |
Storage of table definition | Disk | Memory only |
Types | Transaction-specific ( | Transaction-specific ( |
第三种类型的临时表,即游标持续时间临时表,由数据库为某些类型的查询自动创建。A third type of temporary table, known as a cursor-duration temporary table, is created by the database automatically for certain types of queries.
临时表的目的
临时表在必须缓冲结果集的应用程序中很有用。
例如,日程安排应用程序使大学生能够创建可选的学期课程安排。全局临时表中的一行代表每个计划。在会话期间,计划数据是私有的。当学生选择一个时间表时,应用程序将所选时间表的行移动到一个永久表中。在会话结束时,数据库会自动删除全局临时表中的计划数据。
私有临时表对于动态报告应用程序很有用。例如,客户资源管理 (CRM) 应用程序可能无限期地以同一用户的身份连接,同时多个会话处于活动状态。每个会话创建一个ORA$PTT_crm
为每个新事务命名的私有临时表。应用程序可以为每个会话使用相同的表名,但要更改定义。数据和定义仅对会话可见。表定义一直持续到事务结束或手动删除表。
临时表中的段分配
与永久表一样,全局临时表是在数据字典中静态定义的持久对象。对于私有临时表,元数据只存在于内存中,但可以驻留在磁盘上的临时表空间中。
对于全局和私有临时表,数据库会在会话首次插入数据时分配临时段。在会话中加载数据之前,该表显示为空。对于特定于事务的临时表,数据库在事务结束时释放临时段。对于特定于会话的临时表,数据库会在会话结束时释放临时段。
临时表创建
CREATE ... TEMPORARY TABLE
语句创建一个临时表。
指定“全局临时表”或“专用临时表”。在这两种情况下,ONCOMMIT子句指定表数据是特定于事务(默认)还是特定于会话。您可以为数据库本身创建临时表,而不是为每个PL/SQL存储过程创建临时表。
可以使用create INDEX语句为全局(非私有)临时表创建索引。这些索引也是临时的。索引中的数据与临时表中的数据具有相同的会话或事务范围。还可以在全局临时表上创建视图或触发器。