Otra forma de hacerlo es con la gestión de errores:
declare v_sql varchar(1000);
declare col_missing integer default 0;
declare col_does_not_exist condition for sqlstate '42703';
declare continue handler for col_does_not_exist set col_missing = 1;
set v_sql = 'select table.foo from table';
execute immediate v_sql;
if col_missing = 1 then
--Do something if column foo doesn't exist.
end if;
Este método funcionará en las mesas de sesión, y también se puede utilizar en un objeto, incluso si usted no sabe si se trata de una mesa , vista, alias, etc.
es importante especificar table.foo
en lugar de sólo el nombre de la columna, ya que de lo contrario la existencia de otro objeto (como una variable) llama foo
rompería la prueba.
Este controlador continuará enmascarando cualquier otro error para las columnas que faltan dentro del alcance, por lo que es mejor limitar el alcance a solo la prueba que desea hacer.
Gracias por la respuesta, quiero consultar las tablas de un Esquema específico. Traté de agregar la línea que sugirió, pero la búsqueda no arroja nada (le di el nombre de una columna que sé que existe). ¿Puede explicarme un poco más cómo funciona la consulta? Gracias –
Lo sentimos typo: quest es * request –
Lo que puede estar ensuciándolo es que no agrega el esquema a la parte 'TBNAME' de la cláusula where. Digamos, por ejemplo, que está buscando una columna llamada 'UPDATE_TIMESTAMP' que podría estar en' SCH.TAB1' o 'SCH.TAB2', y cree que puede estar en' SCH.TAB3' (pero no lo está). Su consulta sería 'SELECT STRIP (TBCREATOR) || ''. || TIRA (tbname) DE SYSIBM.SYSCOLUMNS WHERE NOMBRE = 'UPDATE_TIMESTAMP' Y EN tbname ('TAB1', 'TAB2', 'TAB3') Y TBCREATOR = 'SCH'' – bhamby