全局临时表从Oracle中的不同会话获取数据

时间:2010-05-26 16:09:53

标签: oracle

我们在Oracle中有一个使用global temporary tables的存储过程。在我们的大多数其他存储过程中,我们首先要做的是从全局临时表中删除数据。但是,在少数存储过程中,我们没有delete's

除了添加删除语句之外还有其他选项吗?可以在服务器端执行某些操作以在运行该SP时强制删除这些临时表中的数据吗?

GTT定义为ON COMMIT PRESERVE ROWS;

1 个答案:

答案 0 :(得分:2)

我认为你的标题具有误导性:问题不是“从不同的会话中获取数据”,而是重新使用相同的会话。终止会话总是刷新临时表:

SQL> conn apc
Enter password:
Connected.

SQL> create global temporary table tmp_23 (username varchar2(30))
  2  on commit preserve rows
  3  /

Table created.

SQL> insert into tmp_23 values (user)
  2  /

1 row created.

SQL> commit
  2  /

Commit complete.

SQL> select * from tmp_23
  2  /

USERNAME
------------------------------
APC

SQL> conn apc
Enter password:
Connected.
SQL> select * from tmp_23
  2  /

no rows selected

SQL>

在会话中,除了删除截断之外,无法刷新具有PRESERVE ROWS的临时表。无法以您建议的方式注释存储过程。所以我担心如果你在描述它时遇到问题,你将不得不咬紧牙关并将DELETE(或TRUNCATE)调用添加到你的程序中。或者用DELETE ROWS定义表格;但这可能不适合你的处理。

顺便说一下,您似乎正在大量使用临时表。这在Oracle系统中是不常见的,因为临时表是相对昂贵的对象(所有这些写入磁盘)并且通常以更高效的方式接近事物:例如缓存PL / SQL集合中的数据或仅使用SQL。来自非Oracle背景的开发人员(尤其是SQL Server)过度使用临时表是很常见的,因为他们习惯于这种工作方式。