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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 114
    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
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

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

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

    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
    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 confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 114
    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
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    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 éclairé Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    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 confirmé

    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
    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
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 114
    Par défaut
    BONJOUR,
    personne ne me répond?????
    svp aidez moi je suis perdu.
    svp

  9. #9
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Exécute ça.
    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
    SET serveroutput ON SIZE 1000000
    DECLARE
    nom_table 			   dba_tab_columns.table_name%TYPE;
    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 user_tab_columns
    		WHERE NULLABLE='Y'
    		 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 user_tab_columns WHERE table_name = :1' ;
    	   EXECUTE IMMEDIATE requete INTO nb_colonnes USING nom_table;
     
    	   DBMS_OUTPUT.PUT_LINE('La table ' || nom_table || ' contient ' || nb_colonnes || ' colonne(s) nullable');
     
    	END IF;
     
    	   requete := 'SELECT COUNT(1) FROM ' ||  nom_table ||' WHERE ' || colonnes_nullables.column_name || ' IS NULL';
    	   EXECUTE IMMEDIATE requete INTO nb_valeur_null_par_col;
     
    	   DBMS_OUTPUT.PUT_LINE(nb_valeur_null_par_col || ' valeur(s) NULL dans la colonne ' || nom_table || '.' || colonnes_nullables.column_name);
     
    END LOOP;
    END;

    Pour les autres questions c'est du pl/sql standard
    dba_tab_columns.table_name : Nom de table . Nom de colonne

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 114
    Par défaut
    BONSOIR,
    il m'a donné un résultat, 31. mais je veux juste les valeurs non nulles des tables de ma base. pas de toutes les tab
    stp aide moi.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    J'ai tout commenté afin d'expliquer le code... tu devrais pouvoir faire la suite seule

    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
    37
    38
    39
    40
    41
    42
    43
    SET serveroutput ON SIZE 1000000
    DECLARE
    -- la variable nom_table à le même type que la colonne dba_tab_columns.table_name
    nom_table 			   dba_tab_columns.table_name%TYPE;
    -- la variable nb_valeur_null_par_col est un nombre initialisé à 0
    nb_valeur_null_par_col NUMBER := 0;
    -- la variable nb_colonnes est un nombre initialisé à 0
    nb_colonnes            NUMBER := 0;
    -- la variable requete est une chaine de 200 caractères maximum non initialisée (donc NULL)
    requete 			   VARCHAR2(200);
    BEGIN
    -- Je parcoure les lignes de la requête. Pour chaque ligne, je trouverai le contenu dans colonnes_nullables
    -- La requête recherche les tables et leurs colonnes nullable dans le schema courant
    FOR colonnes_nullables IN (SELECT table_name, column_name 
    		  FROM user_tab_columns
    		WHERE NULLABLE='Y'
    		 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 contient la chaine de caractère exécutée par EXECUTE IMMEDIATE
    	   requete := 'SELECT COUNT(column_name) FROM user_tab_columns WHERE table_name = :1' ;
               -- J'exécute le contenu de requete qui compte le nombre de  colonnes de la table :1 (remplacé par nom_table via USING). Le résultat est stocké dans nb_colonnes.
    	   EXECUTE IMMEDIATE requete INTO nb_colonnes USING nom_table;
     
               -- J'affiche "La table x contient y colonnes nullable" ou x et y sont remplacés par le contenu des variable nom_table et nb_colonnes
    	   DBMS_OUTPUT.PUT_LINE('La table ' || nom_table || ' contient ' || nb_colonnes || ' colonne(s) nullable');
     
    	END IF;
     
               -- requete contient la chaine de caractère exécutée par EXECUTE IMMEDIATE
    	   requete := 'SELECT COUNT(1) FROM ' ||  nom_table ||' WHERE ' || colonnes_nullables.column_name || ' IS NULL';
               -- J'exécute le contenu de requete qui compte le nombre de lignes de la table nom_table où la colonne column_name de la ligne courante du curseur est NULL (IS NULL)
    	   EXECUTE IMMEDIATE requete INTO nb_valeur_null_par_col;
     
              -- J'affiche "x valeur(s) NULL dans la colonne y.z" ou x, y et z sont remplacés par le contenu des variable nb_valeur_null_par_col, nom_table et nb_colonnes
    	   DBMS_OUTPUT.PUT_LINE(nb_valeur_null_par_col || ' valeur(s) NULL dans la colonne ' || nom_table || '.' || colonnes_nullables.column_name);
     
    END LOOP;
    END;

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 114
    Par défaut
    bonjour,
    vraiment je vous remercie tous, ca me reste une semaine et je termine tous, et j'embète personne.
    vraiment Merci c'est un super forum.
    Mon problème est résolu.

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

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