Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/02/2011, 22h29   #1
Invité de passage
 
Inscription : février 2010
Messages : 10
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 10
Points : 0
Points : 0
Par défaut Retourne même valeur

Bonsoir,

Je viens vers vous pour vous faire part d'une erreur pénible : j'ai tout une colonne qui se rempli d'une même fausse valeur. Comme vous, je pensais que ça venait d'un problème de type.
Seul hic: toutes les variables appelées ici ont le même type : c'est-à-dire number.
Pouvez-vous m'aider?

Le code est chargé de calculer l'écart entre le nombre de réponse type à un questionnaire de hasard parmi mille répondants et le nombre de réponse réelle des répondants. Celui qui a le plus faible écart est premier.
Voici mon code :
Code :
1
2
3
4
5
6
7
8
9
10
11
CREATE OR REPLACE
PROCEDURE CALCULER_ECART (P_NB_REP_TYPE IN number) AS
cursor cur IS SELECT * FROM bons_bons;
V_ecart number;
BEGIN
  FOR bon IN cur loop
    V_ecart :=  P_NB_REP_TYPE - bon.rep2;
  end loop;
 
  UPDATE bons_bons SET ecart =V_ecart;
END CALCULER_ECART;
guigui64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2011, 10h24   #2
Membre actif
 
Inscription : février 2007
Messages : 167
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 167
Points : 161
Points : 161
Bonjour,

C'est votre algorithme qui est erroné.

Je suppose que le nombre de réponse réel est dans le champ rep2 et que le nombre de réponse type est dans P_NB_REP_TYPE.

Vous affectez successivement chaque écart à la même variable v_ecart.
En sortie de boucle loop v_ecart contient l'écart pour la dernière ligne de bons_bons.
Ensuite vous mettez à jour TOUTE la table bons_bons avec cette valeur puisque qu'il n'y a pas de clause where à votre update. Donc tout le monde a l'écart du dernier.

Si vous voulez utiliser du PlSql et une boucle il faut mettre à jour la table bons_bons à chaque tour de boucle à l'intérieur du loop, en utilisant une clé unique de la table bons_bons si elle en a une. En a-t-elle une ?

Mais pour votre problème vous n'avez pas besoin d'une boucle.
Un simple update sur la table suffit.

Pozzo
Pozzo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2011, 23h49   #3
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
Citation:
Envoyé par Pozzo Voir le message
Si vous voulez utiliser du PlSql et une boucle il faut mettre à jour la table bons_bons à chaque tour de boucle à l'intérieur du loop, en utilisant une clé unique de la table bons_bons si elle en a une. En a-t-elle une ?
Tu n'es pas obligé d'avoir une PK pour faire l'update, avec current of
Code :
1
2
3
4
5
6
7
8
DECLARE
Cursor C IS SELECT * FROM BONS FOR UPDATE;
BEGIN
FOR r IN C LOOP
UPDATE BONS SET col1 = col2
WHERE current of c;
END LOOP;
END;
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h07.


 
 
 
 
Partenaires

Hébergement Web