IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Remplacer les champs vides par des 0


Sujet :

PL/SQL Oracle

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2010
    Messages : 347
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ...

  3. #3
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Par défaut
    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.

  4. #4
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    En complément de ce qu'indique mnitu, j'ajouterai que les lignes suivantes font des updates complets sur la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ).

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2010
    Messages : 347
    Par défaut
    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 ?

  6. #6
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    "Vide", ça ne peut être que null. Avez-vous fais un commit de la transaction ?

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

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



    Merci !

  8. #8
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    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

  9. #9
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    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...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/10/2010, 14h38
  2. Remplacer les controles ajax par des controles ASP
    Par Contact2012 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 12/09/2008, 11h26
  3. Réponses: 5
    Dernier message: 13/12/2006, 16h08
  4. Remplacer les retour chariot par des <br/>
    Par novices dans le forum Langage
    Réponses: 1
    Dernier message: 21/08/2006, 21h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo