我们如何在 pl/sql 块中使用 Oracle 私有临时表?

sha*_*mar 5 oracle temporary

我发现oracle中临时表的概念与SQL Server等其他数据库有很大不同。在Oracle中,我们有一个全局临时表的概念,我们只创建它一次,并且在每个会话中我们用与其他数据库中不同的数据填充它。

在 18c 中,oracle 引入了私有临时表的概念,该概念指出,在成功使用后,可以像其他数据库一样删除表。但是我们如何在 PL/SQL 块中使用它呢?

我尝试使用动态 SQL - 来使用它EXECUTE IMMEDIATE。但它给了我表必须声明错误。我在这里做什么?

Tej*_*ash 1

私有临时表(可从 Oracle 18c 获得)在结束时被删除session/transaction,具体取决于 PTT 的定义。

  • ON COMMIT DROP DEFINITION选项创建一个特定于事务的私有临时表。在事务结束时,Oracle 会删除表定义和数据。
  • ON COMMIT PRESERVE DEFINITION选项创建一个特定于会话的私有临时表。Oracle 在会话结束时删除所有数据并删除表。

您不需要drop手动进行。甲骨文将为您做这件事。

CREATE PRIVATE TEMPORARY TABLE ora$ptt_temp_table (
  ......
)
ON COMMIT DROP DEFINITION; 
-- or
-- ON COMMIT PRESERVE DEFINITION; 
Run Code Online (Sandbox Code Playgroud)

示例(执行ON COMMIT DROP DEFINITION后表被删除)COMMIT

在此输入图像描述

示例ON COMMIT PRESERVE DEFINITION(表在执行后保留COMMIT,但在会话结束时将被删除)

在此输入图像描述

注意:我目前无法访问 18c DB,并且 db<>fiddle 面临一些问题,因此我已经为您发布了图像。

干杯!!