我们在Oracle中有一个使用global temporary tables
的存储过程。在我们的大多数其他存储过程中,我们首先要做的是从全局临时表中删除数据。但是,在少数存储过程中,我们没有delete's
。
除了添加删除语句之外还有其他选项吗?可以在服务器端执行某些操作以在运行该SP时强制删除这些临时表中的数据吗?
GTT定义为ON COMMIT PRESERVE ROWS;
答案 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)过度使用临时表是很常见的,因为他们习惯于这种工作方式。