2010-02-25 15 views
0

J'essaie d'identifier les types de tables en fonction des colonnes qu'elles contiennent dans une procédure stockée. La requête que j'ai initialement créée est la suivante:Recherche d'informations de table et de colonne à partir de all_tab_cols


SELECT CASE WHEN col_one. IS NOT NULL THEN 'COL1' 
        WHEN col_two IS NOT NULL THEN 'COL2' 
       ELSE 'NEITHER' 
       END 
     INTO ls_table_type 
     FROM (SELECT column_name col_one 
      FROM sys.all_tab_cols 
      WHERE upper (owner) = upper ('|OWNER|') 
      AND hidden_column = 'NO' 
      AND virtual_column = 'NO' 
      AND column_id IS NOT NULL 
      AND column_name = '|COL1_NAME|' 
      AND table_name = upper(|TABLE_NAME|)) 
      ,(SELECT column_name as col_two 
      FROM sys.all_tab_cols 
      WHERE upper (owner) = upper ('|OWNER|') 
      AND hidden_column = 'NO' 
      AND virtual_column = 'NO' 
      AND column_id IS NOT NULL 
      AND column_name = '|COL2_NAME|' 
      AND table_name = upper(|TABLE_NAME|)) 

Cela ne fonctionne pas à moins que les deux colonnes soient présentes dans une table. Je suis sûr qu'il me manque une manière évidente d'attaquer ceci.

Répondre

0

Cette requête devrait vous fournir les informations dont vous avez besoin. Si col1 et col2 n'existent pas dans la même table, vous n'obtiendrez aucun enregistrement en double.

select table_name, column_name 
from all_tab_cols 
where owner = '?' 
    and column_name in ('col1', 'col2') 
    and table_name = '?'; -- this line optional 
0

Vous pouvez essayer ceci:

SELECT CASE WHEN EXISTS (SELECT column_name col_one 
     FROM sys.all_tab_cols 
     WHERE upper (owner) = upper ('|OWNER|') 
     AND hidden_column = 'NO' 
     AND virtual_column = 'NO' 
     AND column_id IS NOT NULL 
     AND column_name = '|COL1_NAME|' 
     AND table_name = upper('|TABLE_NAME|')) 
    THEN 'COL1' 
    WHEN EXISTS (SELECT column_name as col_two 
     FROM sys.all_tab_cols 
     WHERE upper (owner) = upper ('|OWNER|') 
     AND hidden_column = 'NO' 
     AND virtual_column = 'NO' 
     AND column_id IS NOT NULL 
     AND column_name = '|COL2_NAME|' 
     AND table_name = upper('|TABLE_NAME|')) 
    THEN 'COL2' 
    ELSE 'NEITHER' 
    END 
FROM DUAL;