Поиск информации о таблице и столбце из all_tab_cols - PullRequest
0 голосов
/ 25 февраля 2010

Я пытаюсь определить типы таблиц на основе столбцов, которые они содержат в хранимой процедуре. Запрос, который я изначально придумал, выглядит следующим образом:


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|))

Это не работает, если в таблице нет обоих столбцов. Я уверен, что упускаю какой-то очевидный способ атаковать это.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2010

Вы можете попробовать это:

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;        
0 голосов
/ 25 февраля 2010

Этот запрос должен предоставить вам необходимую информацию. Если 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
...