将SQL Server带JOIN的UPDATE语句及临时表转换为Oracle语法
没问题,我帮你把SQL Server的这两部分语法转换成Oracle兼容的形式,分两部分详细说明:
一、SQL Server带JOIN的UPDATE语句转换为Oracle语法
SQL Server里常用UPDATE ... FROM ... JOIN的写法实现关联更新,Oracle没有完全一致的语法,但有两种实用的替代方案:
方案1:使用MERGE语句(推荐,功能更全面)
MERGE是Oracle专门用于数据合并的语句,既能处理更新也能处理插入,用来实现关联更新非常合适。举个例子,假设你的SQL Server原语句是这样的:
UPDATE a SET a.price = b.new_price, a.quantity = b.new_quantity FROM #tmp_pricing a JOIN contract_pricing b ON a.contract_nbr = b.contract_nbr AND a.pricing_order = b.pricing_order;
对应的Oracle写法如下:
MERGE INTO tmp_pricing a USING contract_pricing b ON (a.contract_nbr = b.contract_nbr AND a.pricing_order = b.pricing_order) WHEN MATCHED THEN UPDATE SET a.price = b.new_price, a.quantity = b.new_quantity;
方案2:使用关联子查询的UPDATE
如果是简单的单表关联更新,也可以直接用UPDATE加子查询的方式,但要注意子查询必须返回唯一值(否则会抛出ORA-01427错误):
UPDATE tmp_pricing a SET (price, quantity) = ( SELECT b.new_price, b.new_quantity FROM contract_pricing b WHERE a.contract_nbr = b.contract_nbr AND a.pricing_order = b.pricing_order ) WHERE EXISTS ( SELECT 1 FROM contract_pricing b WHERE a.contract_nbr = b.contract_nbr AND a.pricing_order = b.pricing_order );
这里的WHERE EXISTS是为了避免更新那些没有匹配到的行(如果去掉,没有匹配的行对应的列会被设为NULL)。
二、SQL Server临时表转换为Oracle全局临时表
SQL Server的本地临时表(以#开头)对应Oracle的全局临时表,转换时会保留所有原表的字段、数据类型和约束,同时适配Oracle的临时表特性,转换后的代码如下:
CREATE GLOBAL TEMPORARY TABLE tmp_pricing ( contract_nbr INTEGER NOT NULL, pricing_order INTEGER NOT NULL, priced_from_contract_flag CHAR(1) NOT NULL, release_nbr INTEGER NULL, quantity DECIMAL(25, 6) NOT NULL, price DECIMAL(25, 6) NULL, price_future DECIMAL(25, 6) NULL, price_basis DECIMAL(25, 6) NULL, sum_qty DECIMAL(25, 6) NULL, row_nbr INTEGER NULL, new_quantity DECIMAL(25, 6) NULL ) -- 请根据业务需求选择以下其中一种行保留策略: ON COMMIT DELETE ROWS; -- 提交事务后自动清空表数据(默认行为,类似SQL Server临时表会话结束销毁的特性) -- ON COMMIT PRESERVE ROWS; -- 提交事务后保留数据,直到当前会话结束才清空
转换细节说明:
- SQL Server的
INTEGER直接对应Oracle的INTEGER(Oracle中INTEGER是NUMBER(38)的别名,功能完全一致) CHAR(1) COLLATE DATABASE_DEFAULT:Oracle中不需要COLLATE子句,字符集由数据库或会话级配置决定,直接保留CHAR(1)即可- Oracle全局临时表必须指定
ON COMMIT策略:ON COMMIT DELETE ROWS:适合单次事务内使用的临时数据,提交后自动清空ON COMMIT PRESERVE ROWS:数据会保留到会话结束,更贴近SQL Server临时表的会话生命周期
内容的提问来源于stack exchange,提问作者user37793
相关产品推荐
相关产品推荐

