2016-07-22 48 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

相关问题