2010-02-25 22 views
0

我試圖根據存儲過程中包含的列來標識表類型。我最初想到的查詢如下:從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|)) 

這不起作用,除非兩列都出現在表中。我相信我錯過了一些明顯的攻擊方式。

回答

0

此查詢應提供您所需的信息。如果col1和col2不在同一個表中,那麼您將不會得到任何重複的記錄。

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

你可以試試這個:

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;