2010-11-23 4 views
0
I have two tables 
1. 
shiv_tab_col 

TABLENAME  | COLUMNNAME 
-------------------------- 
SER_SHIV_SYN | TABLENAME  
SER_SHIV_SYN | COLUMNNAME 


AND SER_SHIV_SYN 

TABLENAME | COLUMNNAME 
-------------------------- 
A   | B 
E   | NULL 
NULL  | NULL 
NULL  | NULL 
NULL  | NULL 
NULL  | NULL 

BUT WHEN I M TRYING TO RUN THE BELOW CODE IT IS GIVING ME '0' AS VALUE OF TNAME 

DECLARE 
tname varchar(20):=null; 

CURSOR C1 IS 
    SELECT * 
    FROM SHIV_TAB_COL; 


BEGIN 
    for rec in C1 

loop 
    select count(*) into tname from (select nvl(rec.columnname,1)b from ser_shiv_syn) where b ='1'; 
    dbms_output.put_line(tname); 
    dbms_output.put_line(rec.columnname); 
END LOOP; 
END; 

En fait, je cherche à compter le no. des valeurs NULL dans chaque colonne qui seront stockées dans la variable TNAME
pour la première colonne, il doit donner 4
pour 2 colonne, il doit donner 5valeurs de curseur dans la requête SQL

+0

Veuillez améliorer le formatage, c'est vraiment difficile à lire. Et s'il vous plaît ajouter au moins la valeur pour TNAME que vous attendiez. Il est vraiment difficile d'améliorer/corriger quelque chose lorsque vous ne connaissez pas le résultat souhaité. –

+0

Désolé d'être dur, mais votre code n'a que très peu de sens. Il ne semble pas que vous sachiez ce que vous faites, plus comme une copie-pâte-session sauvage avec un peu d'essai et d'erreur. –

+0

Lorsque vous exécutez sélectionnez count (*) dans tname , alors il est raisonnable que vous obtenez tname = '0'. Vous ne pouvez pas joindre les données dans une table avec les noms des tables/colonnes – smirkingman

Répondre

1

Ce que vous faites est à dénombrer aujourd'hui toutes les occurrences vides de la colonne COLUMNNAME dans la table shiv_tab_col. Lequel est 0 (vous l'avez déjà trouvé).

La solution est un peu plus compliqué, vous avez besoin SQL dynamique pour accomplir ce que vous voulez faire:

declare 
    l_count pls_integer; 
begin 
    for r_cur in (
    select columnname 
    from shiv_tab_col 
) 
    loop 
    execute immediate 
     'select count(1) from ser_shiv_syn where '||r_cur.columnname||' is null' 
    into l_count; 
    dbms_output.put_line(l_count); 
    dbms_output.put_line(r_cur.columnname); 
    end loop; 
end; 
/
+0

Merci beaucoup Lot Martin :) – shsh06

+0

Mais je ne comprends toujours pas mon code donnait 0 comme résultat – shsh06

+0

Votre requête a déterminé si la chaîne 'TABLENAME' est nulle (ce n'est pas le cas) et si 'COLUMNNAME' est nul (ce n'est pas non plus). Votre requête est basée sur la mauvaise supposition qu'Oracle traduira réellement la chaîne 'TABLENAME' pour signifier "la colonne TABLENAME de la table ser_shiv_syn". –

1

Juste une petite astuce: Pour votre curseur utilisez:

SELECT column_name 
FROM all_tab_columns 
WHERE table_name = 'SER_SHIV_SYN' 

lieu de shiv_tab_col.

Cette table est automatiquement mise à jour et elle est toujours présente. Il a également le type de champ, la taille, etc. Tout et plus pour 0 coût. Win-Win.

Questions connexes