如何在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
相关产品推荐
相关产品推荐

