Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Pesquisar todos os campos em todas as tabelas por um valor específico (Oracle)


Citar:

Eu tentei usar esta declaração abaixo para encontrar uma coluna apropriada com base no que eu acho que deveria ser nomeado, mas não retornou nenhum resultado.*
SELECT * from dba_objects WHERE
object_name like '%DTN%'

Uma coluna não é um objeto. Se você quer dizer que espera que o nome da coluna seja como '%DTN%', a consulta desejada é:
SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';

Mas se a string 'DTN' for apenas um palpite de sua parte, isso provavelmente não ajudará.

A propósito, você tem certeza de que '22/1/2008P09RR8' é um valor selecionado diretamente de uma única coluna? Se você não sabe de onde vem, pode ser uma concatenação de várias colunas, ou o resultado de alguma função, ou um valor localizado em um objeto de tabela aninhado. Portanto, você pode estar em uma caça ao ganso selvagem tentando verificar todas as colunas para esse valor. Você não pode começar com qualquer aplicativo cliente que esteja exibindo esse valor e tentar descobrir qual consulta ele está usando para obtê-lo?

De qualquer forma, a resposta de diciu fornece um método de geração de consultas SQL para verificar o valor de todas as colunas de todas as tabelas. Você também pode fazer coisas semelhantes inteiramente em uma sessão SQL usando um bloco PL/SQL e SQL dinâmico. Aqui está um código escrito às pressas para isso:
    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;
    /

Existem algumas maneiras de torná-lo mais eficiente também.

Nesse caso, dado o valor que você procura, você pode eliminar claramente qualquer coluna que seja do tipo NUMBER ou DATE, o que reduziria o número de consultas. Talvez até restringi-lo a colunas onde o tipo é como '%CHAR%'.

Em vez de uma consulta por coluna, você pode criar uma consulta por tabela assim:
SELECT * FROM table1
  WHERE column1 = 'value'
     OR column2 = 'value'
     OR column3 = 'value'
     ...
     ;