You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Oracle SQL中创建类似Microsoft SQL Server的临时表?

Oracle中创建临时表的实现方式

Oracle的临时表与SQL Server的临时表机制不同:Oracle临时表是永久定义表结构,临时存储数据,数据仅对当前会话或事务可见,会话结束/事务提交后自动清空(根据类型)。以下是对应你SQL Server示例的几种实现方式:

1. 预先定义会话级临时表(对应SQL Server的#临时表)

先创建会话级临时表结构(只需执行一次,后续同会话内可重复使用):

CREATE GLOBAL TEMPORARY TABLE processid (
    lot_id VARCHAR2(50), -- 替换为实际数据类型
    run_oid NUMBER,      -- 替换为实际数据类型
    process_id VARCHAR2(50) -- 替换为实际数据类型
) ON COMMIT PRESERVE ROWS; -- ON COMMIT PRESERVE ROWS表示数据在整个会话周期内有效

每次需要填充新数据时,先清空表再插入:

TRUNCATE TABLE processid;

INSERT INTO processid (lot_id, run_oid, process_id)
SELECT DISTINCT
    lot_id,
    ssr.run_oid,
    process_id
FROM sigma.sigma_run ssr
INNER JOIN sigma.sigma_lot ssl ON ssl.run_oid = ssr.run_oid;

2. 一次性创建并填充临时表(Oracle 12c+支持)

如果不需要长期保留表结构,可直接通过查询创建临时表并完成数据插入:

-- 若临时表已存在则删除(Oracle 12c及以上支持IF EXISTS语法)
DROP TABLE IF EXISTS processid;

CREATE GLOBAL TEMPORARY TABLE processid ON COMMIT PRESERVE ROWS AS
SELECT DISTINCT
    lot_id,
    ssr.run_oid,
    process_id
FROM sigma.sigma_run ssr
INNER JOIN sigma.sigma_lot ssl ON ssl.run_oid = ssr.run_oid;

3. 单次查询临时使用(CTE替代方案)

如果仅需在单次查询流程中临时使用数据,无需创建实体临时表,可使用CTE(公共表表达式):

WITH processid AS (
    SELECT DISTINCT
        lot_id,
        ssr.run_oid,
        process_id
    FROM sigma.sigma_run ssr
    INNER JOIN sigma.sigma_lot ssl ON ssl.run_oid = ssr.run_oid
)
-- 在此处使用processid进行后续操作,例如:
SELECT * FROM processid;

关键区别说明

  • SQL Server的#临时表是会话私有,表结构随会话结束销毁;Oracle临时表的结构全局可见,但每个会话只能访问自己的私有数据。
  • 若需事务级临时表(数据随事务提交/回滚清空),将ON COMMIT PRESERVE ROWS替换为ON COMMIT DELETE ROWS即可。

内容的提问来源于stack exchange,提问作者sheesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 21:10:28