Cuando intentamos hacer una búsqueda sobre una columna de tipo LONG del mismo modo que operamos con columnas VARCHAR nos encontramos con el problema de que no se comportan del mismo modo. Y el problema es más común de lo que a priori se puede esperar dado que varias vistas del diccionario de datos utilizan este tipo de datos para almacenar información bastante interesante.
En el caso que nos ocupa, estábamos intentando localizar el uso de una columna concreta en cualquier vista accesible por el usuario. Cuando intentamos consultar la vista ALL_VIEWS para localizar en ALL_VIEWS.TEXT las menciones a la columna que buscábamos nos encontramos con el siguiente error:
select * from all_views where upper(text) like '%TABLE_NAME%';
ORA-00932: inconsistent datatypes: expected NUMBER got LONG
La función UPPER() es una más de las muchas que no se pueden aplicar sobre tipos de datos LONG.
Después de darle varias vueltas al problema, e intentar distintas alternativas, logramos escribir un pequeño bloque anónimo que nos permitía realizar la búsqueda:
-- Search in LONG datatype columns set serveroutput on; begin for i in (select * from all_views) loop if instr(upper(i.text), 'TABLE_NAME') > 0 then dbms_output.put_line('View: '||i.view_name); end if; end loop; end;
Y por fin obtuvimos el resultado esperado:
View: ALL_ALL_TABLES View: ALL_TAB_COLUMNS View: ALL_TAB_COL_STATISTICS ... ... ...