2014-08-27 4 views
0

J'utilise Oracle - Développeur SQLParamétrer des valeurs pour oracle sql

Vous voulez vérifier le nombre de valeurs nulles pour chaque colonne.

Actuellement, j'utilise ce qui suit pour obtenir des résultats.

select nom_colonne de all_tab_columns où table_name = 'EMPLOYÉ'

SELECT COUNT (*) FROM EMPLOYEE WHERE <Column_name1> IS NULL 
    UNION ALL 
    SELECT COUNT (*) FROM EMPLOYEE WHERE <Column_name2> NULL 
    UNION ALL 
    SELECT COUNT (*) FROM EMPLOYEE WHERE <Column_name3> IS NULL 
    UNION ALL ...................... 

Comment peut-on utiliser la valeur bind pour exécuter la requête ci-dessous comme

DEFINE Column_name = Column_name1 
    SELECT COUNT (*) FROM EMPLOYEE WHERE &&Column_name IS NULL . 
+0

vous devez aller le chemin SQL dynamique pour cela. – Sathya

+0

'NUM_NULLS' dans' all_tab_columns' aurait le nombre de valeurs 'NULL' dans cette table. A condition que la table ait des stats mises à jour !! Toute donnée insérée/mise à jour sans recueillir de statistiques entraînerait une mauvaise réponse. Pour connaître les statistiques, vous pouvez vous référer à [Oracle Docs] (http://docs.oracle.com/cd/B10500_01/server.920/a96533/stats.htm) –

Répondre

1

Vous ne pouvez pas utiliser de variables de liaison lorsque vous construisez l'instruction select, vous pouvez passer des valeurs via des variables de liaison, mais l'instruction select elle-même ne peut pas être construite. Vous devez aller the dynamic SQL way, using EXECUTE IMMEDIATE.

Voici un exemple:

DECLARE 
    v_sql_statement VARCHAR2(2000); 
    n_null_count NUMBER; 
BEGIN 
    FOR cn IN (SELECT column_name 
       FROM user_tab_cols 
       WHERE table_name = 'EMPLOYEE') LOOP 
     v_sql_statement := 'SELECT COUNT(1) FROM EMPLOYEE where ' 
          || cn.column_name 
          || ' IS null'; 

     EXECUTE IMMEDIATE v_sql_statement INTO n_null_count; 

     dbms_output.Put_line('Count of nulls for column: ' 
          || cn.column_name 
          || ' is: ' 
          || n_null_count); 
    END LOOP; 
END; 

C'est ce que la requête ci-dessus chercher

Nombre de valeurs NULL pour la colonne: EMPNO est: 0
Nombre de valeurs NULL pour la colonne: NAME est: 0
Nombre de zéros pour la colonne: JOB est: 0
Nombre de zéros pour la colonne: BOSS est: 1
Nombre de valeurs nulles pour la colonne: HireDate est la suivante: 0
Nombre de valeurs nulles pour la colonne: TRAITEMENT est la suivante: 0
Nombre de valeurs nulles pour la colonne: COMM est la suivante: 20
Nombre de valeurs nulles pour la colonne: DEPTNO est la suivante: 0

+0

Pourquoi pas un seul «EXECUTE IMMEDIATE» utilisant all_tab_columns? 'COUNT (COLUMN_NAME1), COUNT (COLUMN_NAME2) FROM TABLE'? –

+0

@MaheswaranRavisankar COLUMN_NAME1, COLUMN_NAME2 ...COLUMN_NAMEn sont des lignes dans all_tab_columns, vous devez parcourir toutes les lignes et ne pas trouver de valeurs nulles pour chaque nom_colonne – Sathya

+0

Merci Satya pour vos conseils – Awknewbie

0

Non, vous ne pouvez pas le faire avec des variables liées . Ceci est dû au fait que la requête est conforme et qu'elle doit connaître le nom du champ au moment de la compilation. Pour réaliser ce que vous voulez, vous pouvez créer la requête dont vous avez besoin dans un VARCHAR2 et utiliser l'exécution immédiate.

0

Pourquoi ne pas simplement utiliser NUM_NULLS? Mais vous devez recueillir les statistiques avant

exec dbms_stats.gather_table_stats('user','TBL'); 

select num_nulls from user_tab_columns where table_name='TBL'; 

Vous pouvez également utiliser coalesce pour l'exécution plus rapide que IS NULL

SELECT COUNT(COALESCE(_COLUMN, 1)) AS CNT FROM _TABLE; 

Si vous voulez avoir une colonne compter sage alors je serais deuxième réponse de Sathya mais avec COALESCE au lieu de IS NULL

Questions connexes