mise à jour à l'aide de la boucle en plsql
je vais avoir des problème de mise à jour et l'insérer en dessous de la colonne. Veuillez aviser sur ce.
C'est l'entrée
depnto extra comm
----------------------------
20 300 NULL
20 300 400
20 NULL NULL
20 500 NULL
C'est la sortie attendue de
depnto Extra comm
---------------------
20 300 300
20 300 400
20 NULL NULL
20 500 500
J'ai besoin de mettre à jour comm
colonne avec extra
colonne ci-dessous les conditions.
- Si comm Est null, la valeur supplémentaire est mis à jour pour la comm.
- Si comm n'Est pas nul, pas besoin de mise à jour,
- Si les deux sont nuls, laissez null,
- si comm colonne a une valeur pas besoin de le remplacer.
Mon programme est ci-dessous. Même que j'ai besoin de garder une trace, qui sont des lignes de mise à jour et à quelle valeur dans une autre table.
PROCEDURE (dept_id )
AS
BEGIN
FOR r IN (SELECT *
FROM emp
WHERE comm IS NULL AND extra IS NOT NULL AND deptno = dept_id)
LOOP
UPDATE emp
SET comm = extra
WHERE comm IS NULL AND extra IS NOT NULL AND deptno = dept_id;
INSERT INTO changed_comm (deptno, oldval, newval)
VALUES (dept_id, r.comm, r.extra);
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
END;
veuillez fournir des avis sur ci-dessus. Sa n'insérez pas correctement.
OriginalL'auteur user2686661 | 2013-09-07
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas besoin
FOR LOOP
, juste une mise à JOUR fait le travail:Voici une démo: http://www.sqlfiddle.com/#!4/aacc3/1
--- EDIT ----
Je n'avais pas remarqué, que dans de la sortie attendue de deptno 10 a été mis à jour à 20,
mise à jour
deptno
une autre requête est nécessaire:---- EDIT -----
Si vous souhaitez insérer les valeurs modifiées à l'autre table, essayez une procédure de RETOUR..en VRAC RECUEILLIR et POURTOUT:
La procédure devrait fonctionner si vous n'êtes pas passer grand nombre d'enregistrements dans un appel (plus de 1000 ... ou au maximum quelques milliers). Si l'on
dept_id
peut contenir des dizaines de milliers et plus de lignes, alors cette procédure peut être lente, car il va consommer une quantité énorme de la PGA de la mémoire. Dans un tel cas, une autre approche avec en vrac collectiong en morceaux est nécessaire.-- EDIT --- comment stocker les valeurs de séquence -------
Je suppose que la table
changed
a 4 colonnes, comme ceci:et nous allons stocker les valeurs de séquence dans le
seq_nextval
colonne.Dans un tel cas, la procédure pourrait ressembler à ceci:
--- EDIT --- version avec le curseur pour de petits ensembles de données -----
Oui, pour de petits ensembles de données en vrac collecte ne donne pas d'augmentation significative de la vitesse, et la plaine curseur avec pour..la boucle est suffisante dans de tels cas.
Ci-dessous est un exemple de la façon dont tu utiliser le curseur avec la mise à jour, de l'avis de la
FOR UPDATE
clause, il est nécessaire lorsque nous avons l'intention de mettre à jour un enregistrement extraite à partir du curseur à l'aide deWHERE CURRENT OF
clause.Cette fois, une valeur de séquence est évalué dans le cadre de l'instruction INSERT.
Désolé, j'ai juste édité , maintenant il y a seulement deptno 20, mais comment l'insérer si beaucoup de comm= null est mis à jour.. comme je l'ai mentionné dans le code à insérer dans changed_comm , pour être fait dans une seule procédure. Merci de m'aider sur ce point
J'ai changé la réponse, il est un exemple de la procédure qui pourrait vous aider.
Reconnaissant à vous, essayez cet exemple
J'ai corrigé l'exemple, la précédente valeurs insérées APRÈS la mise à jour, Mon erreur, je m'excuse, jetez un oeil à la version corrigée.
OriginalL'auteur krokodilko
OriginalL'auteur Shashank Shekhar Singh