2016-07-22 8 views
0

PL/SQLを学習しようとしていて、どのように取り組むべきかわからない課題がありました。PL/SQLアイテムのリスト、レコードが存在するかどうかを確認します。作成しない場合は更新します。

注文の一覧が表示されます。私は、次の方法でそれらのそれぞれのために私ORDERテーブルをチェックしたいん:順序が存在する場合は

  1. チェック、オーダーfullfilled(0または1)
  2. 場合は順序がある場合は何がレコード
  3. チェックを作成した場合1

に(0)、更新をfullfilledない私は一緒に私は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ステートメントに基づいており、UPDATEまたはINSERTデータを使って、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

0

MERGE文をよく読んでください:

https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htmはまた、 "アップサート" と呼ばれます。基本的に行が存在しない場合は、挿入します。そうであれば、更新してください。

これは、1つのステートメントで実行しようとしていることを実行します。

+0

は行います、ありがとうございます。 – Ziqq

関連する問題