在 Oracle 中,可以通过多种方式创建临时表(Temporary Table)。Oracle 的临时表有一个特点:数据是临时的,但表结构是永久的。根据数据的生命周期,临时表分为两种类型:


🔹 1. 创建临时表的语法

CREATE GLOBAL TEMPORARY TABLE 表名 (
    列名 数据类型,
    ...
)
ON COMMIT [DELETE | PRESERVE] ROWS;

参数说明:

  • GLOBAL TEMPORARY:表示这是一个全局临时表(Oracle 目前只支持全局临时表)。
  • ON COMMIT DELETE ROWS:每次事务提交时,数据会被自动清空。
  • ON COMMIT PRESERVE ROWS:事务提交后,数据仍然保留,直到会话结束。

🔹 2. 示例

✅ 每次事务提交清空数据

CREATE GLOBAL TEMPORARY TABLE temp_emp (
    emp_id NUMBER,
    emp_name VARCHAR2(50)
)
ON COMMIT DELETE ROWS;

✅ 会话结束时才清空数据

CREATE GLOBAL TEMPORARY TABLE temp_dept (
    dept_id NUMBER,
    dept_name VARCHAR2(50)
)
ON COMMIT PRESERVE ROWS;

🔹 3. 使用临时表示例

INSERT INTO temp_emp (emp_id, emp_name) VALUES (101, 'Tom');
COMMIT;  -- 如果用了 ON COMMIT DELETE ROWS,这行数据会在这里被清空

SELECT * FROM temp_emp;

🔹 4. 注意事项

  • 临时表的结构是永久的,只创建一次
  • 可以在临时表上创建索引,但索引也是临时的。
  • 临时表的数据只对当前 session 可见,多个 session 互不干扰
  • 使用完毕后,无需手动清除数据,它会自动清理。

🔹 5. 删除临时表(如不再使用)

DROP TABLE temp_emp;

如果你需要在 PL/SQL 或存储过程里动态建表、插入临时数据,可以考虑临时表或使用 WITH 子句(CTE)/ 内存表结构(比如 Oracle 18c 以后的 PRIVATE TEMPORARY TABLES)。如果你对这方面有兴趣,我也可以进一步介绍。

需要我给你加上 Oracle 18c 之后的 PRIVATE TEMPORARY TABLE 吗?