迁移 Oracle 到 PostgreSQL: 全局临时表

五月 21, 2023

Oracle 数据库的临时表,用于存放只存在于某个事务或会话期间的数据。临时表中的数据是会话私有的,这意味着每个会话只可以查看和修改自己的数据。

临时表对于必须缓冲中间结果集的应用程序非常有用。例如,一个计划应用程序使学生可以创建可选的学期课程计划。每个课程计划由临时表中的一行表示。在会话期间,课程计划数据是私有的。当某个学生确定了课程计划,应用程序会将其所选计划移入永久表。在会话结束时,临时表中的课程计划数据将被自动删除。

PostgreSQL 和 Oracle 中临时表的差异

PostgreSQL临时表的语义与Oracle的语义有很大不同。以下是简要的概述:

  • Oracle 临时表是永久性的,因此其结构是静态的,对所有用户可见,并且内容是临时的。
  • PostgreSQL 临时表在会话结束时或事务结束时被删除。在PostgreSQL中,临时表的结构和内容对于创建表的数据库后端(进程)都是本地的。
  • Oracle 临时表始终在用户指定的模式中定义。
  • PostgreSQL 临时表不能在用户的模式中定义,它们总是使用特殊的临时模式。

移植依赖于许多临时表的大型 Oracle 应用程序可能很困难:

  • Oracle 查询可能会对临时表使用schema.table的表示法,这在 Postgres 中是不允许的。如果模式与当前用户名相同,我们可以省略它,但我们仍然可能有引用其他模式的查询。
  • Postgres 要求在访问每个临时表之前在同一会话或事务中创建每个临时表。

如果应用程序应该同时与 Postgres 和 Oracle 一起工作,情况会变得更糟,因此我们不能只是修复查询并在代码中乱扔大量创建临时表语句。

PostgreSQL 中的临时表

1、创建临时表模板(一次性创建)

-- 临时表模板
create table tmp1_template(xxxx);

2、以后每次使用某临时表之前,使用 CREATE TEMP TABLE 语句,指定模板表创建临时表。

create temp table if not exists tmp_xxx 
  (like tmp1_template including all)
  ON COMMIT DELETE ROWS;

3、以后要修改临时表的结果,直接修改模板表

alter table tmp_xxx add column c1 int;

示例:

-- 创建临时表模板表
create table tmp1_template (
    id int8 primary key,
    info text, 
    crt_time timestamp);

-- 每次使用临时表前,先使用模板创建
create temp table if not exists tbl_tmp
  (like tmp1_template including all)
  ON COMMIT DELETE ROWS;

-- 以后要修改临时表的结果,直接修改模板表
alter table tmp1_template add column c1 int;