2014-09-23 3 views
1

Как использовать BULK COLLECT и FORALL для замены CURSOR FOR LOOP в PL/SQL? Я хотел бы иметь более эффективный способ обновления записей в одной таблице.Как использовать BULK COLLECT и FORALL для замены CURSOR FOR LOOP в PL/SQL?

Предположим, у меня есть следующий код PL/SQL:

DECLARE 
    var_buy_more_shoes inventory.buy_more_shoes%TYPE := NULL; 
    var_buy_more_bananas inventory.buy_more_bananas%TYPE := NULL; 
    var_buy_more_iphone6s inventory.buy_more_iphone6s%TYPE := NULL; 

    CURSOR cur 
    IS 
     SELECT * 
     FROM inventory 
     FOR UPDATE; 

BEGIN 
    FOR rec IN cur 
    LOOP 
     IF rec.pair_of_shoes_left <= 100 
     THEN 
     var_buy_more_shoes := 'Yes'; 
     END IF; 

     IF rec.weight_of_bananas_left <= 200 
     THEN 
     var_buy_more_bananas := 'Yes'; 
     END IF; 

     IF rec.number_of_iphone6s_left <= 50 
     THEN 
     var_buy_more_iphone6s := 'Yes'; 
     END IF; 

     UPDATE inventory a 
     SET A.buy_more_shoes = var_buy_more_shoes, 
      A.buy_more_bananas = var_buy_more_bananas, 
      A.buy_more_iphone6s = var_buy_more_iphone6s 
     WHERE CURRENT OF cur; 
    END LOOP; 

    COMMIT; 
END; 

Спасибо.

ответ

5

Это может быть сделано в одном операторе обновление:

UPDATE inventory 
SET buy_more_shoes = CASE 
          WHEN pair_of_shoes_left <= 100 THEN 'Yes' 
          ELSE NULL 
         END 
    , buy_more_bananas = CASE 
          WHEN weight_of_bananas_left <= 200 THEN 'Yes' 
          ELSE NULL 
         END 
    , buy_more_iphone6s = CASE 
          WHEN number_of_iphone6s_left <= 50 THEN 'Yes' 
          ELSE NULL 
         END 
+0

Хорошо, это не то, что я прошу, но работает. – Hank

Смежные вопросы