2016-07-22 98 views
0

我試圖學習PL/SQL,我被賦予一個任務,我不知道如何解決。PL/SQL列表的項目,檢查是否存在記錄,如果是的話更新,如果沒有創建

我給出了一個訂單列表。我想檢查我的訂單表中的每個人以下列方式:

  1. 檢查順序是否存在,如果沒有創造紀錄
  2. 檢查順序fullfilled(0或1)
  3. 如果訂單不fullfilled(0),更新到1

我把一個劇本,我認爲可以爲一個爲了做到這一點,但我敢肯定,這不是很好:

DECLARE 
tmp NUMBER; 
tmp2 NUMBER; 
o_id NUMBER := 999; 

BEGIN 

/*Checking if order exists */ 
    SELECT COUNT (*) 
    INTO tmp 
     FROM ORDERS 
    WHERE ORDERID = o_id;    

    IF (tmp = 0) THEN 
/* INSERT HERE */ 
    END IF; 

    SELECT FULLFILLED INTO tmp2 
    FROM ORDERS 
    WHERE ORDERID = o_id; 


    IF (tmp2 = 0) THEN 
/* UPDATE... */ 

    END IF; 

end; 

我將不勝感激任何建議,我應該看看如何使這個腳本高效?謝謝。

回答

0

MERGE聲明是您所需要的。它基於SELECT聲明,我們來UPDATEINSERT數據使用它的WHEN (NOT) MATCHED THEN子句。這裏有一些很好的例子:Oracle Base MERGE Statement

這裏也有一些代碼片斷可能對您有用:

DECLARE 
    o_id  NUMBER := 999; 
BEGIN 
    MERGE INTO ORDERS o 
    USING 
     (SELECT o_id AS orderid FROM dual) o_id 
    ON 
     (o.orderid = o_id.orderid) 
    WHEN MATCHED THEN 
     UPDATE SET 
      o.fulfilled = CASE WHEN o.fulfilled = 0 THEN 1 ELSE o.fulfilled END 
    WHEN NOT MATCHED THEN 
     INSERT (fulfilled, <some_other_columns>) 
     VALUES (1, <values_for_other_columns>); 


END; 
/
+0

您是否介意在「USING」下的select語句中爲什麼使用「dual」? – Ziqq

相關問題