2009-02-17 7 views
3
declare 
begin 
    for i in (select * from emp) 
    loop 
    if i.sal=1300 then 
     update emp 
     set sal=13000; 
    end if; 
    end loop; 
end; 

Ce code est mise à jour tous les enregistrements avec le salaire 13000.
Au lieu de cela je veux mettre à jour les dossiers ayant le salaire 1300 à la valeur 13000.
Pouvez-vous dire où je fait une erreur?
J'accesing enregistrements à l'aide curseur implicite ..
pour chaque enregistrement je vérifie la valeur sal de ce dossier ..
si la valeur salariale dans un dossier particulier est de 1500 je veux le mettre à jour à 15000 ..Mise à jour des enregistrements de base de données dans une boucle?

Répondre

9

Chaque fois que vous pouvez faire la mise à jour avec un seul déclaration, vous devriez le faire au lieu d'utiliser une boucle. Vous obtiendrez un énorme gain de performance de cette façon; ou, dans l'autre sens, les mises à jour dans une boucle vous coûtent beaucoup de performance.

Si vous devez vraiment utiliser une boucle, vous avez bien sûr besoin d'une condition where pour vous assurer de ne mettre à jour que l'enregistrement que vous voulez vraiment mettre à jour. Une façon qui fonctionne toujours (même s'il n'y a pas de clé unique disponible) est d'utiliser le numéro de ligne Pseudo-:

begin 
    for i in (select rowid, emp.* from emp) 
    loop 
    if i.sal=1300 then 
     update emp 
     set sal=13000 
     where rowid=i.rowid; 
    end if; 
    end loop; 
end; 

Une autre possibilité serait l'aide d'un curseur explicite et la « mise à jour ... où le courant de cursorname "syntaxe.

5

Vous devez mettre une contrainte sur votre instruction de mise à jour.

Qu'est-ce que vous avez au moment bouclera à travers les lignes de résultats, et si elle trouve une ligne avec un salaire égal à 1300, si alors exerces oici SQL:

update emp 
set sal=13000;

Sans contraint Cette mise à jour toutes les lignes .

25

supprimer ce code et il suffit d'utiliser:

update emp set sal = 13000 where sal = 1300 
5

Ce code est mise à jour tous les enregistrements avec le salaire 13000. Au lieu de cela je veux mettre à jour les dossiers ayant le salaire 1300 à la valeur 13000.

pour chaque enregistrement je vérifie la valeur sal de cet enregistrement .. si la valeur de salaire dans un dossier particulier est 1500 je veux le mettre à jour à 15000 ..

Alors, que voulez-vous exactement?

Vous souhaitez mettre à jour seulement 1500 salaire, vous émettez:

UPDATE emp 
SET sal = 15000 
WHERE sal = 1500; 

Vous voulez augmenter tous les salaires dix fois, vous émettez:

UPDATE emp 
SET sal = sal * 10; 
Questions connexes