2010-02-25 6 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;