¿Es posible buscar en cada campo de cada tabla un valor particular en Oracle?
Hay cientos de tablas con miles de filas en algunas tablas, así que sé que la consulta puede llevar mucho tiempo. Pero lo único que sé es que un valor para el campo que me gustaría consultar es 1/22/2008P09RR8
. <
Intenté usar esta declaración a continuación para encontrar una columna apropiada en función de lo que creo que debería llamarse, pero no arrojó resultados.
SELECT * from dba_objects
WHERE object_name like '%DTN%'
No hay absolutamente ninguna documentación en esta base de datos y no tengo idea de dónde se extrae este campo.
¿Alguna idea?
Respuestas:
Citar:
Una columna no es un objeto. Si quiere decir que espera que el nombre de la columna sea como '% DTN%', la consulta que desea es:
Pero si la cadena 'DTN' es solo una suposición de su parte, eso probablemente no ayudará.
Por cierto, ¿qué tan seguro está de que '1/22 / 2008P09RR8' es un valor seleccionado directamente de una sola columna? Si no sabe en absoluto de dónde proviene, podría ser una concatenación de varias columnas, o el resultado de alguna función, o un valor que se encuentra en un objeto de tabla anidado. Por lo tanto, es posible que esté en una búsqueda inútil tratando de verificar cada columna para ese valor. ¿No puede comenzar con cualquier aplicación cliente que muestre este valor e intentar averiguar qué consulta está utilizando para obtenerlo?
De todos modos, la respuesta de diciu ofrece un método para generar consultas SQL para verificar el valor de cada columna de cada tabla. También puede hacer cosas similares por completo en una sesión de SQL utilizando un bloque PL / SQL y SQL dinámico. Aquí hay un código escrito apresuradamente para eso:
Hay algunas formas de hacerlo más eficiente también.
En este caso, dado el valor que estás buscando, claramente puedes eliminar cualquier columna que sea del tipo NUMBER o DATE, lo que reduciría el número de consultas. Quizás incluso restringirlo a columnas donde el tipo es como '% CHAR%'.
En lugar de una consulta por columna, puede crear una consulta por tabla como esta:
fuente
all_tab_columns
noall_tables
. Lo he arreglado.Hice algunas modificaciones al código anterior para que funcione más rápido si solo está buscando un propietario. Solo tiene que cambiar las 3 variables v_owner, v_data_type y v_search_string para que se ajusten a lo que está buscando.
fuente
'SELECT COUNT(*) FROM "'||t.table_name||'" WHERE "'||t.column_name||'" = :1'
dbms_output
? Porque las consultas se ejecutan con éxito en DataGrip, pero no veo ningún resultado después.Aquí hay otra versión modificada que comparará una coincidencia de subcadena inferior. Esto funciona en Oracle 11g.
fuente
Sí, puede y su DBA lo odiará y encontrará que clava sus zapatos en el piso porque eso causará muchas E / S y reducirá el rendimiento de la base de datos a medida que se purga la caché.
para comenzar.
Comenzaría con las consultas en ejecución, usando
v$session
yv$sqlarea
. Esto cambia según la versión de Oracle. Esto reducirá el espacio y no afectará a todo.fuente
Sé que este es un tema antiguo. Pero veo un comentario a la pregunta que pregunta si se podría hacer en
SQL
lugar de usarPL/SQL
. Así que pensé en publicar una solución.La siguiente demostración es buscar un VALOR en todas las COLUMNAS de todas las TABLAS en un ESQUEMA completo :
Busquemos el valor
KING
en elSCOTT
esquema.Busquemos el valor
20
en elSCOTT
esquema.fuente
Error occurred in XML processing ORA-00932: inconsistent datatypes: expected NUMBER got BLOB
Haría algo como esto (genera todas las selecciones que necesita). Más tarde puede alimentarlos a sqlplus:
Cede:
Y lo que hace es - para cada uno
table_name
deuser_tables
conseguir cada campo (de desc) y crear un selecto * de la tabla donde el campo es igual a 'val'.fuente
Modifiqué el script de Flood para que se ejecute una vez para cada tabla en lugar de para cada columna de cada tabla para una ejecución más rápida. Requiere Oracle 11g o superior.
fuente
Estaba teniendo problemas para la respuesta de @Lalit Kumars,
La solución es:
fuente
si conocemos los nombres de la tabla y de las columnas, pero queremos saber el número de veces que aparece una cadena para cada esquema:
fuente
Procedimiento para buscar en toda la base de datos:
Ejecutar declaración
Resultados de muestra
fuente
No tengo una solución simple en el indicador SQL. Sin embargo, hay bastantes herramientas como toad y PL / SQL Developer que tienen una GUI donde un usuario puede ingresar la cadena que se buscará y devolverá la tabla / procedimiento / objeto donde se encuentra.
fuente
Hay algunas herramientas gratuitas que hacen este tipo de búsqueda, por ejemplo, esta funciona bien y el código fuente está disponible: https://sites.google.com/site/freejansoft/dbsearch
Necesitará el controlador ODBC de Oracle y un DSN para utilizar esta herramienta.
fuente
Modificar el código para buscar sin distinción entre mayúsculas y minúsculas utilizando una consulta LIKE en lugar de buscar coincidencias exactas ...
fuente
--se ejecuta completado - sin error
fuente
Tomar prestado, mejorar ligeramente y simplificar de esta publicación del blog la siguiente declaración SQL simple parece hacer el trabajo bastante bien:
fuente
fuente