Oracle - Buscar un valor en cualquier campo de cualquier tabla

 
Vista:
sin imagen de perfil
Val: 12
Ha disminuido 1 puesto en Oracle (en relación al último mes)
Gráfica de Oracle

Buscar un valor en cualquier campo de cualquier tabla

Publicado por juan francisco (11 intervenciones) el 31/10/2018 20:06:24
Hola me gustaría saber si es posible montar alguna consulta con las tablas de sistema para saber en que campo de que tabla o tablas se encuentra un dato o valor por ejemplo: número pedido: 345647 busque el campo y la tabla donde está este dato
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antonio
Val: 42
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Buscar un valor en cualquier campo de cualquier tabla

Publicado por Antonio (13 intervenciones) el 31/10/2018 22:19:28
Sabes? me haces un reto con esa pregunta!!!!
hemos trabajado en varios buscadores y utilizamos oracle text, siempre unimos todos los datos que queremos incluir en la busqueda en una sola columna de texto y lo indexamos con un indice de texto, luego se realixza la busqueda utilizando las funciones que brinda oracle text, los datos puedne estar en diferentes tablas, pero siempre todo está relacionado con una llave principal por donde se enlazan todas las tablas del esquema.
Lo que estás preguntando me ha retado a hacer algo que busque sin preparación de indice ni tablas previas, algo así como una función que le pases un dato y te devuelva el nombre de la tabla o las tablas y las filas dónde aparece el valor. Muy interesante, te prometo que voy a pensar en esa solución.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 12
Ha disminuido 1 puesto en Oracle (en relación al último mes)
Gráfica de Oracle

Buscar un valor en cualquier campo de cualquier tabla

Publicado por juan francisco (11 intervenciones) el 01/11/2018 07:50:22
Muchas gracias, te agradezco tu compromiso con este tema.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de gilman
Val: 117
Bronce
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Buscar un valor en cualquier campo de cualquier tabla

Publicado por gilman (52 intervenciones) el 02/11/2018 09:40:52
Puedes usar la vista ALL_TAB_COLS para generar consultas dinámicas sobre las tablas que contengan dicho campo.
1
2
3
SELECT *
  FROM SYS.ALL_TAB_COLS
 WHERE ALL_TAB_COLS.COLUMN_NAME = 'MICAMPO'
Te devolverá la información de todas las columnas con nombre MICAMPO, con información de a que tabla pertencen, tipo...
a partir de ahí, puedes construir consultas dinámicas para saber cuales de las tablas contienen un determinado valor en ese campo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antonio
Val: 42
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Buscar un valor en cualquier campo de cualquier tabla

Publicado por Antonio (13 intervenciones) el 02/11/2018 19:56:54
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.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar