Una manera rápida de determinar si existe un campo en una tabla de Oracle
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.
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;