2012-05-21 4 views
-1

hye ... у меня есть 1 таблица имен rumah, которые содержат id, nama, jenis_rumah и шить поле. мне нужно обновить шиповое поле, когда nama нравится% RIZAL%, а затем обновляет шитье * 3. если jenis_rumah = корнет-лот, то обновите шитье с 20% скидкой. Это мой pl/sql, но процесс обновления не работает ... нужен совет от эксперта. TQ.обновить одно и то же полевое твиз

первая проба:

DECLARE CURSOR rec IS 

SELECT id, nama, jenis_rumah, sewa 
FROM rumah; 

nama varchar2 (100); 
jenis_rumah varchar2(100); 
upd_cntr NUMBER := 0; 
tot_all  NUMBER :=0; 

    BEGIN 
    FOR z1 IN rec LOOP 

      if upper (nama) like '%RIZAL%' then 
       begin 
       UPDATE rumah 
       SET sewa = sewa*3 
       where id = z1.id ; 
       end; 

       elsif jenis_rumah = 'CORNER LOT' THEN 
       Begin 
       UPDATE rumah 
       SET sewa = (sewa * 80/100) 
       where id = z1.id; 
       end; 

       END IF;  


      upd_cntr := upd_cntr + 1; 
      tot_all := tot_all + 1; 

     END LOOP; 

      DBMS_OUTPUT.PUT_LINE('Total Updated Sewa:' || tot_all);  
    END; 

второго испытание: я примерить другие, только нам как% Ризали% обновляются

DECLARE CURSOR rec IS 

SELECT id, nama, jenis_rumah, SUM (sewa*3) AS upd_sewa 
FROM rumah 
WHERE UPPER (nama) LIKE '%RIZAL%' 
GROUP BY id, nama, jenis_rumah, sewa; 

jenis_rumah varchar2(100); 
upd_cntr NUMBER := 0; 
tot_all  NUMBER :=0; 

    BEGIN 
    FOR z1 IN rec LOOP 

      UPDATE rumah 
      SET sewa = z1.upd_sewa 
      where id = z1.id ; 

     IF jenis_rumah = 'CORNER LOT' THEN 
      UPDATE rumah 
      SET sewa = (sewa * 80/100); 
      END IF;  


      upd_cntr := upd_cntr + 1; 
      tot_all := tot_all + 1; 


     END LOOP; 

      DBMS_OUTPUT.PUT_LINE('Total Updated Sewa:' || tot_all); 

    END; 
+0

Зачем вам нужна процедура для этого? – Marc

ответ

4

Вы не нуждался бы в PL/SQL для чего вы пытаетесь достичь.

Попробуйте вместо этого:

UPDATE rumah 
     SET sewa = 
       CASE 
        WHEN UPPER(nama) LIKE '%RIZAL%' THEN sewa*3 
        WHEN jenis_rumah = 'CORNER LOT' THEN (sewa * 80/100) 
        ELSE sewa 
       END 
     ; 
+0

спасибо, но есть ошибка непоследовательных типов данных: ожидается, что NUMBER получил CHAR – user1407005

+0

@ user1407005 Каков тип шитья? – Chandu

0

Вам не нужна процедура. Просто запустите 2 оператора обновления.

UPDATE rumah 
    SET sewa = sewa*3 
where upper (nama) like '%RIZAL%'; 


UPDATE rumah 
    SET sewa = (sewa * 80/100) 
where jenis_rumah = 'CORNER LOT'; 
+0

спасибо, но я не хочу запускать его вручную, поэтому мне нужно ввести процедуру. что вы думаете?? – user1407005

+0

@ user1407005, вы также можете поместить обновление в процедуру. Но решение Cybernate, вероятно, немного более элегантно. – Marc

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