2012-05-21 4 views
-1

hye ... J'ai 1 nom de table rumah qui contiennent id, nama, jenis_rumah et sewa champ. J'ai besoin de mettre à jour le champ Sewa quand nama aime% RIZAL%, puis mettre à jour sewa * 3. si jenis_rumah = lot de cornet alors mettre à jour sewa avec 20% de réduction. C'est mon pl/sql, mais le processus de mise à jour échoue ... besoin de conseils d'experts. tq.mettre à jour le même champ twise

1er essai:

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; 

2ème essai: je tente sur la façon différente, que nama% comme RIZAL% est mis à jour

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

Pourquoi avez-vous besoin d'une procédure pour cela? – Marc

Répondre

4

Vous auriez pas besoin d'un PL/SQL pour ce que vous essayez d'accomplir.

Essayez ceci:

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

merci, mais il y a erreur types de données incohérents: attendu NUMBER obtenu CHAR – user1407005

+0

@ user1407005 Quel est le type de données de sewa? – Chandu

0

Vous n'avez pas besoin d'une procédure. Il suffit de lancer 2 instructions de mise à jour.

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


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

merci, mais je ne veux pas le lancer manuellement, c'est pourquoi je dois mettre en procédure. Qu'est-ce que tu penses?? – user1407005

+0

@ user1407005, vous pourriez mettre une mise à jour dans une procédure aussi. Mais la solution de Cybernate est probablement un peu plus élégante. – Marc

Questions connexes