Cita:.
He intentado usar esta declaración a continuación para encontrar una columna apropiada basada en lo que creo que debe ser nombrado pero no hay ningún resultado *
SELECT * from dba_objects WHERE
object_name like '%DTN%'
Una columna no es un objeto. Si se refiere a que se espera que el nombre de la columna a ser como '% DTN%', la consulta que desea es:
SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';
Pero si la cadena 'DTN' es sólo una suposición de su parte, que probablemente ganado' t ayuda.
Por cierto, ¿qué tan seguro es que '1/22 / 2008P09RR8' es un valor seleccionado directamente de una sola columna?Si no sabe en absoluto de dónde viene, podría ser una concatenación de varias columnas, o el resultado de alguna función, o un valor sentado en un objeto de tabla anidada. Por lo tanto, podría estar en una búsqueda inútil intentando verificar cada columna por ese valor. ¿No puede comenzar con la aplicación del cliente que muestra este valor y tratar de averiguar qué consulta está utilizando para obtenerlo?
De todos modos, la respuesta de diciu da un método para generar consultas SQL para verificar cada columna de cada tabla para el valor. También puede hacer cosas similares por completo en una sesión SQL utilizando un bloque PL/SQL y SQL dinámico. Aquí hay un código escrito apresuradamente-para eso:
SET SERVEROUTPUT ON SIZE 100000
DECLARE
match_count INTEGER;
BEGIN
FOR t IN (SELECT owner, table_name, column_name
FROM all_tab_columns
WHERE owner <> 'SYS' and data_type LIKE '%CHAR%') LOOP
EXECUTE IMMEDIATE
'SELECT COUNT(*) FROM ' || t.owner || '.' || t.table_name ||
' WHERE '||t.column_name||' = :1'
INTO match_count
USING '1/22/2008P09RR8';
IF match_count > 0 THEN
dbms_output.put_line(t.table_name ||' '||t.column_name||' '||match_count);
END IF;
END LOOP;
END;
/
Hay algunas maneras en que podría hacerlo más eficiente.
En este caso, dado el valor que está buscando, puede eliminar claramente cualquier columna que sea de tipo NÚMERO o FECHA, lo que reduciría el número de consultas. Tal vez incluso restringirlo a columnas donde el tipo es como '% CHAR%'.
En lugar de una consulta por columna, se podría construir una consulta por tabla como esta:
SELECT * FROM table1
WHERE column1 = 'value'
OR column2 = 'value'
OR column3 = 'value'
...
;
¿Podemos hacer esto utilizando una sola consulta en lugar de utilizar un procedimiento almacenado? – Freakyuser
Sí, es posible hacerlo en SQL puro. Consulte [** SQL para buscar un VALOR en todas las COLUMNAS de todas las TABLAS en un SCHEMA completo **] (https://lalitkumarb.wordpress.com/2015/01/06/sql-to-search-for-a- value-in-all-columns-of-all-atbles-in-an-whole-schema /) –
@LalitKumarB La página que ha enumerado ya no está accesible. ¿Sería posible publicar alguna información como respuesta? –