Быстрый способ определить, существует ли поле в таблице ORACLE - PullRequest
7 голосов
/ 17 февраля 2010

Я ищу быстрое предложение SQL для определения, существует ли поле в таблице или нет.

На самом деле я использую это предложение

Select 1 
   from dual
   where exists (select 1 
                   from all_tab_columns 
                  where table_name = 'MYTABLE' 
                    and column_name = 'MYCOLUMN')

Я думаю, что должен быть самый быстрый способ определить, существует ли столбец в ORACLE.

UPDATE

Я оптимизирую большую программную систему, которая выполняет несколько вызовов этого запроса, я не могу изменить исходный код; (, только я могу изменить запрос, который хранится во внешнем файле.

Таблица all_tab_columns содержит более миллиона записей.

Ответы [ 6 ]

9 голосов
/ 17 февраля 2010

первичный ключ all_tab_columns равен owner, table_name, column_name, поэтому поиск конкретного владельца будет быстрее (или используйте user_tab_columns).

2 голосов
/ 17 февраля 2010

Предлагаю прочитать эту статью в AskTom. Это объясняет, что самый быстрый способ проверить это совсем не проверять.

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:698008000346356376

1 голос
/ 17 февраля 2010

Этого запроса достаточно:

 SELECT null
  FROM user_tab_columns
 WHERE table_name = 'MYTABLE' and column_name = 'MYCOLUMN'

Единственным быстрым способом является запрос непосредственно из внутренних таблиц, который не является рекомендуемым способом , и вам необходимо предоставить доступ к объектам sys:

select null
from sys.col$ c
   , sys.obj$ o
   , sys.obj$ ot
where o.name = 'MYTABLE'
  and c.name = 'MYCOLUMN'
  and o.obj# = c.obj#
  and o.owner# = userenv('SCHEMAID')
  and ot.type#(+) = 13
  and (o.type# in (3, 4)                                    
       or
       (o.type# = 2 
        and
        not exists (select null
                      from sys.tab$ t
                     where t.obj# = o.obj#
                       and (bitand(t.property, 512) = 512 or
                            bitand(t.property, 8192) = 8192))))

Этот запрос взят из определения USER_TAB_COLUMNS и может меняться в зависимости от версии (10gR2 в моем случае) . По этому запросу я сократил ссылки на информацию, которую вы не запрашивали.

В любом случае, почему вы хотите это проверить?

1 голос
/ 17 февраля 2010

Запрос к словарю данных Oracle - как показывает пример, это, вероятно, самый быстрый способ.

Словарь данных кэшируется в памяти и должен быть в состоянии удовлетворить запрос довольно быстро. Возможно, вам удастся получить немного более быстрые результаты, если вы знаете фактического владельца схемы таблицы, так что вам не придется платить за поиск по всем схемам.

0 голосов
/ 22 августа 2018

Ez, самый быстрый способ - просто создать такую ​​функцию:

  Create function exist(v_table in varchar2, v_col in  varchar2) 
 Return integer is
 Res integer:= 0;
 Begin
   Begin
      Execute immediate 'select ' || v_col || ' from '|| v_table;         
      Res:=1;
      Exception when other then null;
   End;
Return (res);
End;
0 голосов
/ 05 января 2016

Этот SQL-запрос выдаст имя всей таблицы, имеющей столбец «NAVIGATION_ID» для пользователя «DSGIDEV»

выберите * из всех_таблиц. Протоколов, где column_name = 'NAVIGATION_ID' и owner = 'DSGIDEV'

Итак, измените имя столбца на столбец, который вы хотите найти, а владельца - на имя вашего владельца.

...