Oracle全局临时表/PHP交互题

Posted

技术标签:

【中文标题】Oracle全局临时表/PHP交互题【英文标题】:Oracle Global Temporary Table / PHP interaction question 【发布时间】:2010-09-12 11:45:07 【问题描述】:

我从未使用过全局临时表,但是我对它们在 php 环境中如何工作有一些疑问。

数据如何共享:假设通过 php 使用 oci8 持久连接到 oracle。数据是否与数据库 ID 相关联?它是基于 Apache httpd 恶魔完成的吗?还是每个单独的请求都是独一无二的?

会话的数据何时从全局临时表中清除?我假设(或者更确切地说希望)它在 php 脚本退出时完成。或者,如果不是,我假设我需要在脚本退出之前将其删除。

【问题讨论】:

【参考方案1】:

全局临时表只是表结构(名称、列名、列数据类型等)的逻辑定义。当会话通过插入数据来引用它时,会在临时表空间中创建一个数据段以仅保存该会话的数据。因此,不同的会话可以引用相同的逻辑表定义,因为它们都有自己的专用数据段,可以在提交或会话断开连接时轻松清除这些数据段,而不会影响其他会话。

GTT 中的数据清除可以在提交时或在会话结束时进行,具体取决于创建时使用的选项。在任何一种情况下,您都不必在断开连接之前亲自进行清洗。

GTT 的一个有用替代方案是子查询分解子句(“WITH”),您可以在其中创建多个关系,这些关系可以引用之前在该 SQL 语句中声明的关系。这些可以在临时表空间中实现为数据段,当它们超过一定的内存使用量时由 Oracle 自动实现,或者使用 MATERIALIZE 优化器提示手动实现。

【讨论】:

【参考方案2】:

如果我没记错的话,全局临时表中的数据只能从一个活动会话中获得,并且只能用于这个活动会话(我的意思是会话 = 连接)。因此,您只能看到之前在活动会话中插入的数据。因此我相信,这些数据在结束会话后被清除。无论您使用哪种语言。

至少我是这么认为的。 :D

这里是这样写的: http://www.oracle-base.com/articles/8i/TemporaryTables.php

全局临时表中的数据是私有的,因此会话插入的数据只能由该会话访问。

临时表中的数据会在数据库会话结束时自动删除,即使它异常结束。

对不起,我的英语不好。

【讨论】:

以上是关于Oracle全局临时表/PHP交互题的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 表变量和临时表的区别

Oracle全局临时表和私有临时表

Oracle全局临时表和私有临时表

如何使用 Oracle 全局临时表?

oracle 全局临时表

Oracle 存储过程的全局临时表的替代方法