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

SQL Oracle Discussion :

nombre de valeurs non nulles dans une tables


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 114
    Points : 47
    Points
    47
    Par défaut nombre de valeurs non nulles dans une tables
    bonsoir,
    je cherche a compter e nombre de valeurs non nulles dans une table parmi les tables de ma base.
    cette table contient plusieurs champs donc c'est presque impossible de compter les nombre de valeurs dans chaque champ et après je multiplie par le nombre total des champs, j'ai plusieurs tables et je dois faire ca a chaque table donc est c'est qu'il ya une requète sous oracle qui fait ca en une seule fois? je pense qu'il ya mais je trouve pas
    pouvez vous m'aidez svp??
    Merci

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    non, il faudra passer par un execute immediate et dba_tab_columns

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Il me semble qu'on a déjà répondu à un post comme ceci.



    Edit : Arf, en fait c'était déjà toi

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 114
    Points : 47
    Points
    47
    Par défaut
    BONJOUR
    j'ai cherché mais je trouve pas la réponse.
    c'est quoi la syntaxe exactement ofrafrance??
    Merci

  5. #5
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Aller... j'suis dans un bon jour :

    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
    set serveroutput on size 1000000
    DECLARE
    nom_table 			   dba_tab_columns.table_name%type;
    tab_owner 			   dba_tab_columns.owner%type := '&schema';
    nb_valeur_null_par_col NUMBER := 0;
    nb_colonnes            NUMBER := 0;
    requete 			   VARCHAR2(200);
    BEGIN
    FOR colonnes_nullables IN (select table_name, column_name 
    					   	     from dba_tab_columns
    							where NULLABLE='Y'
    							  and owner = tab_owner
    						     order by 1,2) LOOP
     
    	-- réinitialisation des variables si on passe à une autre table
    	IF NVL(nom_table,'0') != colonnes_nullables.table_name THEN
    	   nom_table := colonnes_nullables.table_name;
     
    	   requete := 'SELECT COUNT(column_name) FROM dba_tab_columns WHERE table_name = :1 and owner = :2' ;
    	   execute immediate requete INTO nb_colonnes USING nom_table,tab_owner;
     
    	   dbms_output.put_line('La table ' || nom_table || ' contient ' || nb_colonnes || ' colonne(s)');
     
    	END IF;
     
    	   requete := 'SELECT COUNT(1) FROM ' || tab_owner || '.' || nom_table ||' WHERE :1 IS NULL';
    	   execute immediate requete INTO nb_valeur_null_par_col USING colonnes_nullables.column_name;
     
    	   dbms_output.put_line(nb_valeur_null_par_col || ' valeur(s) NULL dans la colonne ' || nom_table || '.' || colonnes_nullables.column_name);
     
    END LOOP;
    END;
    /
    Par contre, attention aux temps de réponse

  6. #6
    Membre averti Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 342
    Points
    342
    Par défaut
    Bonjour tout le monde... et Salut OraFrance

    J'ai voulu utiliser ton script pour lister tout les champs nulls de mon schèma, et j'ai été obligé de remplacer les lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       requete := 'SELECT COUNT(1) FROM ' || tab_owner || '.' || nom_table ||' WHERE :1 IS NULL';
    	   execute immediate requete INTO nb_valeur_null_par_col USING colonnes_nullables.column_name;
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      requete := 'SELECT COUNT(*) FROM ' tab_owner || '.' || nom_table ||' WHERE ' ||colonnes_nullables.column_name ||' IS NULL';
    execute immediate requete INTO nb_valeur_null_par_col ;
    Et j'avoue ne pas piger pourquoi le premier cas ne fonctionne pas

    J'ai modifé le count(1) par count(*) pour permettre à Oracle d'utiliser la PK(si elle existe).

    Merci pour vos eventuelles lumières.
    LBO72.

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    les bind variables sont remplacées comme étant des valeurs, jamais des instructions SQL.

    Petit bug d'Orafrance.

    Dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'SELECT COUNT(1) FROM ' || tab_owner || '.' || nom_table ||' WHERE :1 IS NULL'
    sera exécuté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(1) FROM TAB_OWNER.MATABLE WHERE 'col1' IS NULL

  8. #8
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    J'ai modifé le count(1) par count(*) pour permettre à Oracle d'utiliser la PK(si elle existe).
    ?! C'est pareil logiquement.

  9. #9
    Membre averti Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 342
    Points
    342
    Par défaut
    Merci McM pour ton éclaircissement

    Pour le count(1) , il me semble qu'on oblige Oracle à faire son calcul par rapport à la colonne 1. Alors que pour count(*), on lui laisse le choix pour faire son calcul par rapport à la bonne colonne qui lui permet d'optimiser la requête.


    LBO72.

  10. #10
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Depuis la version 8, il ne doit plus y avoir de différence entre count(*) et count(1) d'après AskTom.

  11. #11
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par LBO72 Voir le message
    Pour le count(1) , il me semble qu'on oblige Oracle à faire son calcul par rapport à la colonne 1. Alors que pour count(*), on lui laisse le choix pour faire son calcul par rapport à la bonne colonne qui lui permet d'optimiser la requête.
    Sauf que là tu comptes pas le nombre de ligne de la PK mais de n'importe quelle colonne non NULL (par définition, n'importe quoi sauf la PK )

  12. #12
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par McM Voir le message
    les bind variables sont remplacées comme étant des valeurs, jamais des instructions SQL.

    Petit bug d'Orafrance.

    Dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'SELECT COUNT(1) FROM ' || tab_owner || '.' || nom_table ||' WHERE :1 IS NULL'
    sera exécuté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(1) FROM TAB_OWNER.MATABLE WHERE 'col1' IS NULL
    Pourtant quand j'ai testé ça fonctionner

    mais tu dois en effet avoir raison c'est d'ailleurs la raison qui ne m'a pas permis d'utiliser les binds dans le nom de la table

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 114
    Points : 47
    Points
    47
    Par défaut
    bonsoir les gars
    j'ai ouvert la discussion et je me sui occupé par autre chose.
    j'ai tester le code d'ofrafrance mais ca fonctionne pas.
    je suis nouvelle dans le domaine d'oracle.
    vraiment j'ai bp appris mais ce code je n'est ni compris ni pu l'implémenter pour mes tables.
    est ce que c'est possible de m'expliquer de c'est koi table_name par exemple la séparation en rouge est ce que appartient au code ou la mettre dans d'autre conditions .
    svp aidez moi avec des exemples concrets.
    je suis vraiment pressée et je suis reconnaissante pour vous tous.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 114
    Points : 47
    Points
    47
    Par défaut
    ecoutez moi svp,
    a partir de ce que j'ai compris votre code biensur calcule le nombre de valeurs non nulles dans une table.
    pour moi c'est un peu spécial.
    ma table est remplise des valeurs générés aléatoirement. donc c'est pas mentionné NULL dans le champ mais par contre il ya une chaine vide.
    je cherche a compter le nombre de chaine vide dans toute la classe.
    j'espère que j'ai bien expliqué

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 114
    Points : 47
    Points
    47
    Par défaut
    bonsoir,
    svp essayez de me répondre c quoi ces deux phrases??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nom_table 			   dba_tab_columns.table_name%type;
    tab_owner 			   dba_tab_columns.owner%type := '&schema';
    table_name est ce que le nom de ma table que je dois mettre et le %type c qoui????
    la meme chose pour la deuxième ligne.
    Merci

  16. #16
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par 080983 Voir le message
    ecoutez moi svp,
    a partir de ce que j'ai compris votre code biensur calcule le nombre de valeurs non nulles dans une table.
    pour moi c'est un peu spécial.
    ma table est remplise des valeurs générés aléatoirement. donc c'est pas mentionné NULL dans le champ mais par contre il ya une chaine vide.
    je cherche a compter le nombre de chaine vide dans toute la classe.
    j'espère que j'ai bien expliqué
    IS NULL la colonne est vide
    = 'NULL' la colonne contient le mot NULL
    = NULL sera toujours faux

    Citation Envoyé par 080983 Voir le message
    bonsoir,
    svp essayez de me répondre c quoi ces deux phrases??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nom_table 			   dba_tab_columns.table_name%type;
    tab_owner 			   dba_tab_columns.owner%type := '&schema';
    table_name est ce que le nom de ma table que je dois mettre et le %type c qoui????
    la meme chose pour la deuxième ligne.
    Merci
    ce sont la déclaration de 2 variables qui on le même type que le colonne indiquée avant le %

    tab_owner prend la valeur &shema, c'est à dire la variable SQL*Plus qui sera demandée lors de l'exécution du script.

    Il y a un tutoriel sur le PL/SQL sur ce site, je t'invite à le lire

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 114
    Points : 47
    Points
    47
    Par défaut
    bonjour ofrafrance,
    j'ai executer le code il m'a demandé le numero de schema,
    keske je dois mettre??

  18. #18
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par LBO72 Voir le message
    Pour le count(1) , il me semble qu'on oblige Oracle à faire son calcul par rapport à la colonne 1.
    Pour info, c'est pas la colonne 1, c'est la valeur 1.
    On peut mettre count(0), count('toto'), count(18* -1)
    Attention, mettre un count(colonne1) renvoie le nb de colonne1 NOT NULL (donc oblige oracle à lire cette colonne)

    C'est comme le EXISTS. Il ne faut pas mettre une colonne dans le select.

  19. #19
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par 080983 Voir le message
    bonjour ofrafrance,
    j'ai executer le code il m'a demandé le numero de schema,
    keske je dois mettre??
    Le nom de ton schéma.

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 114
    Points : 47
    Points
    47
    Par défaut
    bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DECLARE
    nom_table 			   dba_tab_columns.table_name%type;
    tab_owner 			   dba_tab_columns.owner%type := '&schema';
    nb_valeur_null_par_col NUMBER := 0;
    nb_colonnes            NUMBER := 0;
    requete 	
    		   VARCHAR2(200);
    dba_tab_columns.table_name: c'est quoi table name??
    est ce que je dois mettre le nom de ma table au lieu de table_name?? c a d ca devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nom_table      dba_tab_columns.X%type
    ??
    pour tab_owner la meme chose; est ce que "&scehma" c a d le nom d'utilisateur ke g SYSTEM?? ou le nom de ma base??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    BEGIN
    FOR colonnes_nullables IN (select table_name, column_name 
    					   	     from dba_tab_columns
    							where NULLABLE='Y'
    							  and owner = tab_owner
    						     order by 1,2) LOOP
    est ce que colonnes_nullables est une variable connu par le sgbd?? la meme pour table_name et column_name je dois les remplacer ou conuu??
    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
    -- réinitialisation des variables si on passe à une autre table
    	IF NVL(nom_table,'0') != colonnes_nullables.table_name THEN
    	   nom_table := colonnes_nullables.table_name;
     
    	   requete := 'SELECT COUNT(column_name) FROM dba_tab_columns WHERE table_name = :1 and owner = :2' ;
    	   execute immediate requete INTO nb_colonnes USING nom_table,tab_owner;
     
    	   dbms_output.put_line('La table ' || nom_table || ' contient ' || nb_colonnes || ' colonne(s)');
     
    	END IF;
     
    	   requete := 'SELECT COUNT(1) FROM ' || tab_owner || '.' || nom_table ||' WHERE :1 IS NULL';
    	   execute immediate requete INTO nb_valeur_null_par_col USING colonnes_nullables.column_name;
     
    	   dbms_output.put_line(nb_valeur_null_par_col || ' valeur(s) NULL dans la colonne ' || nom_table || '.' || colonnes_nullables.column_name);
     
    END LOOP;
    END;
    /
    svp répondez moi je tourne et j'avance pas , j'ai rien compris. croyez moi que ma tete va se casser mais je suis obligée de terminer mon travail.
    j'attend, sauvez moi Merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/04/2012, 08h34
  2. Trouver des valeurs non uniques dans une table
    Par morbli dans le forum Langage SQL
    Réponses: 11
    Dernier message: 29/09/2011, 11h56
  3. Réponses: 2
    Dernier message: 08/03/2011, 11h53
  4. Réponses: 2
    Dernier message: 11/05/2009, 09h36
  5. Garder les valeurs non nulles dans une matrice
    Par mfontan dans le forum MATLAB
    Réponses: 4
    Dernier message: 03/04/2009, 13h42

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