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 16/11/2011, 10h56   #1
Membre régulier
 
Homme Nicolas
Étudiant
Inscription : mai 2010
Messages : 308
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2010
Messages : 308
Points : 74
Points : 74
Par défaut Remplacer les champs vides par des 0

Bonjour à tous,

En remplissant une table, certains champs restent vides car ils manquent des informations nécessaires à leur remplissage. Le fait que les champs n'ont pas de données n'est pas grave, simplement, je préfèrerais qu'ils soient remplis par des 0 (ce sont des champs de type float).
J'ai donc besoin de parcourir les lignes, et pour ça j'ai fais un curseur :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
declare    
 
	Cursor remplaceNullPar0 IS
        SELECT DISTINCT <nom des champs>
        FROM <nom de la table>
        ;
	<nomVariable1> <nom de la table>.<nom champ 1>%type;
	<nomVariable2> <nom de la table>.<nom champ 2>%type;
	<nomVariable3> <nom de la table>.<nom champ 3>%type;
 
 
begin
 
	Open remplaceNullPar0;
    Fetch remplaceNullPar0 INTO <nom variable 1, 2 et 3>;
 
    While (remplaceNullPar0%FOUND)
    Loop
		IF (<nomVariable1> IS NULL)
		then
		     UPDATE <nom de la table> SET <nom champ 1> = 0;
		elsif (<nomVariable2> IS NULL)
		then
		     UPDATE <nom de la table> SET <nom champ 2> = 0;
		elsif (<nomVariable3> IS NULL)
		then	
		     UPDATE <nom de la table> SET <nom champ 3> = 0;
		end IF;
	End loop
 
	commit;
	close remplaceNullPar0;
end;
/
exit;
Malheureusement, après 1h, la requête n'a toujours pas donné de résultat. Donc je suppose, soit qu'il ne se passe rien et qu'elle tourne en boucle, soit que la requête n'est clairement pas optimisée (la table comporte ~200.000 lignes et peut encore augmenter en quantité).

J'aimerais donc bien savoir ou le problème pourrait être situé.

Merci !
feldi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 11h10   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 313
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 313
Points : 5 819
Points : 5 819
Citation:
Envoyé par feldi Voir le message
... Le fait que les champs n'ont pas de données n'est pas grave, simplement, je préfèrerais qu'ils soient remplis par des 0 (ce sont des champs de type float).
...!
C'est une mauvaise idée.

Boucler sur la table via un curseur pour mettre à jour un champ c'est une autre mauvaise idée.

Mettez à jour la table avec une seule requête.
Code :
1
2
3
4
5
6
7
8
 
UPDATE TABLE
  SET colonne1 = Nvl(colonne1, 0),
       colonne2 = Nvl(colonne2, 0),
       ...
WHERE colonne IS NULL 
  OR colonne2 IS NULL 
  OR ...
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/11/2011, 11h13   #3
Membre chevronné
 
Avatar de pinocchio
 
Homme François
Développeur informatique
Inscription : novembre 2002
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 35
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : novembre 2002
Messages : 773
Points : 787
Points : 787
Par la suite, tu pourrais également ajouter la valeur 0 par défaut lors des insert.
Pour cela, soit tu le fais dans la requête insert en elle-même soit dans la table, tu mets default 0 au niveau du champ où c'est nécessaire.
__________________
La SNCF est mon ami
blog PARIS-GRANVILLE
Inscription au panel IPSOS (possibilité d'avoir des bons d'achats)
pinocchio est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 11h15   #4
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
En complément de ce qu'indique mnitu, j'ajouterai que les lignes suivantes font des updates complets sur la table :
Code :
1
2
3
4
 
IF (<nomVariable1> IS NULL)
		then
		     UPDATE <nom de la table> SET <nom champ 1> = 0;
Il n'y a pas d'association "automatique" d'un élément du curseur à la table ; autrement dit, avec cette syntaxe, pour chaque élément du curseur, vous mettez à jour toutes les lignes de la table en mettant la valeur du champ à 0 (ce qui, outre des performances atroces, va poser un léger problème sur les données ).
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/11/2011, 11h17   #5
Membre régulier
 
Homme Nicolas
Étudiant
Inscription : mai 2010
Messages : 308
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2010
Messages : 308
Points : 74
Points : 74
Merci pour ton aide.

La requête s'éxécute en moins d'une seconde mais les champs restent vides.
Il n'y a ni 0, ni "Null".

Le problème viendrait d'autre part ?


@Rei Ichido : ah bon ? il ne mettrait pas à jour uniquement la ligne concernée ?
feldi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 11h19   #6
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
"Vide", ça ne peut être que null. Avez-vous fais un commit de la transaction ?
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 11h21   #7
Membre régulier
 
Homme Nicolas
Étudiant
Inscription : mai 2010
Messages : 308
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2010
Messages : 308
Points : 74
Points : 74
Citation:
Envoyé par Rei Ichido Voir le message
"Vide", ça ne peut être que null. Avez-vous fais un commit de la transaction ?



Merci !
feldi est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 16/11/2011, 11h30   #8
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
Citation:
Envoyé par feldi Voir le message
@Rei Ichido : ah bon ? il ne mettrait pas à jour uniquement la ligne concernée ?
À moins d'avoir un update précis, non. Pour cela, il faudrait que le curseur ramène un identifiant de la ligne, et rajouter une clause WHERE sur cet identifiant.
Cela dit, autant faire un UPDATE massif
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 20h56   #9
Membre éprouvé
 
Avatar de xdescamp
 
Homme Xavier Descamps
Inscription : octobre 2008
Messages : 297
Détails du profil
Informations personnelles :
Nom : Homme Xavier Descamps
Âge : 36
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2008
Messages : 297
Points : 422
Points : 422
Envoyer un message via Skype™ à xdescamp
En complément de toutes les bonnes choses qui ont été dites (en particulier qu'il vaut mieux faire un UPDATE global qu'utiliser la méthode du curseur), la raison pour laquelle votre code ne se terminera jamais est qu'il y a une boucle infinie : après l'ouverture du curseur, le FETCH est bien fait une 1e fois, mais il n'est jamais fait à l'intérieur de la boucle. Du coup on reste toujours sur les premières variables récupérées, et la condition du while est toujours vraie...
xdescamp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h38.


 
 
 
 
Partenaires

Hébergement Web