2015-10-28 85 views
-1

这是MySQL代码。将Mysql转换为Oracle

UPDATE ORDER_ITEM OI 
INNER JOIN ORDER_PAYMENT OP 
ON OI.ORDER_PAYMENT_ID = OP.ORDER_PAYMENT_ID 
SET OI.ORDER_STATUS = '10', 
    OI.PAY_DATE   = '20150101', 
    OP.PAY_DATE   = '20150101' 
WHERE OI.ORDER_STATUS  = '0' 
AND OP.AMOUNT    = 3333 
AND OP.REMAINING_AMOUNT  = 0 
AND OP.ORDER_PAYMENT_ID  = 9999 

转换Oracle错误=> ORA-00971:缺少SET关键字

我想知道这种说法转换到Oracle。

PS。 Oracle中可用的多表更新?

+1

http://www.geeksengine.com/article/oracle-cross-table-update.html –

回答

0

当然,Oracle不允许在一个SQL语句中更新两个表。所以,你需要为你的情况下,3个语句:

-- This query locks target rows in both tables. 
-- It's required to be sure that rows wasn't changed in other sessions 
-- between the first and second UPDATE statements 
SELECT * 
    FROM order_item oi 
INNER JOIN order_payment op 
    ON oi.order_payment_id = op.order_payment_id  
WHERE oi.order_status = '0' 
    AND op.amount = 3333 
    AND op.remaining_amount = 0 
    AND op.order_payment_id = 9999 
    FOR UPDATE NOWAIT 

-- first update 
UPDATE order_item 
    SET order_status = '10', 
     pay_date = '20150101' 
WHERE rowid IN (SELECT oi.rowid 
         FROM order_item oi 
        INNER JOIN order_payment op 
         ON oi.order_payment_id = op.order_payment_id         
        WHERE oi.order_status = '0' 
         AND op.amount = 3333 
         AND op.remaining_amount = 0 
         AND op.order_payment_id = 9999); 

--second update 
UPDATE order_payment 
    SET pay_date = '20150101' 
WHERE rowid IN (SELECT op.rowid 
         FROM order_item oi 
        INNER JOIN order_payment op 
         ON oi.order_payment_id = op.order_payment_id         
        WHERE oi.order_status = '0' 
         AND op.amount = 3333 
         AND op.remaining_amount = 0 
         AND op.order_payment_id = 9999); 

使用PL/SQL,我们可以简化这个代码一点点,但我们仍然必须写一个SELECT FOR UPDATE以及每个连接表一个更新。