Buscar un valor en cualquier campo de cualquier tabla
juan francisto, esta es una solución, pero... recuerda esta función va a buscar en todas las columnas de todas las tablas de un esquema, eso quiere decir que si en tu esquema existieran tablas muy grandes, o sea con miles o millones de filas pudiera demorarse un poco, claro que en las columnas que tienen indice es muy rápido.
Yo lo limité a las columnas VARCHAR2 y NUMBER, tu puedes variar eso.
Aquí está:
CREATE OR REPLACE FUNCTION BUSCA_TODO(vPar IN VARCHAR2) RETURN VARCHAR2 IS
vCant INTEGER ;
vRes VARCHAR2(4000) ;
BEGIN
FOR B IN (SELECT
TABLE_NAME TABLA,
COLUMN_NAME COL
FROM USER_TAB_COLS
WHERE DATA_TYPE IN ('VARCHAR2','NUMBER')
ORDER BY TABLE_NAME) LOOP
BEGIN
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||B.TABLA||' WHERE '||B.COL||' = '''||vPar||'''' INTO vCant ;
IF vCant > 0 THEN
vRes := vRes||'['||B.TABLA||'.'||B.COL||'.'||vCant||']' ;
END IF ;
EXCEPTION
WHEN INVALID_NUMBER THEN
NULL ;
WHEN OTHERS THEN
RAISE ;
END ;
END LOOP ;
RETURN vRes ;
END ;
/
Un ejemplo de búsqueda puede ser:
SELETC BUSCA_TODO(345647) FROM DUAL ;
Esto devuelve una cadena con: [TABLA1.COL1.x][TABLA1.COL2,y][TABLA2,COL3,z]......
10 significa la cantidad de veces que aparece el valor en esa columna de la tabla.
Utilizo un bloque PL/SQL dentro del FOR .. LOOP para poder capturar la EXCEPTION cuando se compara una cadena con un número y no se puede comvertir.
Una variante podría ser crear una tabla en tu esquema con las tablas y las columnas que realmente necesitas poner en las busquedas y previamente crearle indices a dichas columnas.