sql >> Base de Datos >  >> RDS >> Oracle

Buscar en todos los campos de todas las tablas un valor específico (Oracle)

Cita:

Intenté usar esta declaración a continuación para encontrar una columna adecuada según el nombre que creo que debería tener, pero no arrojó resultados.*

SELECT * from dba_objects WHERE
object_name like '%DTN%'

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:

SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';

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 '22/1/2008P09RR8' es un valor seleccionado directamente de una sola columna? Si no sabe 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 persecución 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 brinda 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 usando 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;
    /

También hay algunas maneras en las que podrías hacerlo más eficiente.

En este caso, dado el valor que buscas, puedes 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, podría crear una consulta por tabla como esta:

SELECT * FROM table1
  WHERE column1 = 'value'
     OR column2 = 'value'
     OR column3 = 'value'
     ...
     ;