Pregunta

Busco una sentencia SQL rápido para determinar cuándo un campo existe o no en una mesa.

En realidad estoy usando esta frase

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

Creo que debe haber una manera más rápida para determinar si existe una columna de Oracle.

Actualizar

Estoy optimización de un sistema de software más grande que hace varias llamadas a esta consulta, no puedo modificar el código fuente;. (, Sólo yo puedo modificar la consulta que se almacena en un archivo externo

los all_tab_columns tabla tiene más de un millón de registros.

¿Fue útil?

Solución

la clave primaria de all_tab_columns se owner, table_name, column_name así que buscando un propietario particular, será más rápido (o utilizar user_tab_columns).

Otros consejos

Sugiero leer este artículo AskTom. Explica que la manera más rápida para comprobar no es para comprobar en absoluto.

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

Consulta del diccionario de datos de Oracle - como ejemplo lo hace de hecho, es probablemente la manera más rápida

.

El diccionario de datos se almacena en caché en la memoria y debe ser capaz de satisfacer la consulta con bastante rapidez. Usted puede ser capaz de obtener resultados ligeramente más rápido si se conoce el propietario del esquema real de la mesa -. Por lo que no se incurre en el costo de la búsqueda contra todos los esquemas

Esta consulta es suficiente:

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

La forma más rápida es única para consultar directamente de las tablas internas que no es un método recomendado y que necesita subvenciones sobre los objetos 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))))

Esta consulta se toma de la definición USER_TAB_COLUMNS y se puede cambiar con diferentes versiones (10gR2 en mi caso) . En esta consulta He cortado las referencias a información no solicitada por usted.

De todos modos, ¿por qué quiere comprobar esto?

Esta consulta SQL le dará el nombre de toda la mesa con la columna 'NAVIGATION_ID' para el usuario 'DSGIDEV'

SELECT * FROM all_tab_cols donde nombre_columna = 'NAVIGATION_ID' y propietario = 'DSGIDEV'

Por lo tanto, cambiar el nombre de la columna con la columna que desea buscar y propietario con su nombre de identificación del propietario.

Ez manera más rápida, se acaba de crear función como esta:

  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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top