É possível pesquisar cada campo de cada tabela por um valor específico no Oracle?
Existem centenas de tabelas com milhares de linhas em algumas tabelas, então eu sei que a consulta pode levar muito tempo. Mas a única coisa que sei é que um valor para o campo que eu gostaria de consultar é1/22/2008P09RR8
. <
Tentei usar a instrução abaixo para encontrar uma coluna apropriada com base no que acho que deveria ser nomeada, mas não retornou nenhum resultado.
SELECT * from dba_objects
WHERE object_name like '%DTN%'
Não há absolutamente nenhuma documentação neste banco de dados e não tenho ideia de onde esse campo está sendo obtido.
Alguma ideia?
Respostas:
Citar:
Uma coluna não é um objeto. Se você quer dizer que espera que o nome da coluna seja como '% DTN%', a consulta desejada é:
Mas se a string 'DTN' for apenas uma suposição de sua parte, isso provavelmente não ajudará.
A propósito, como você tem certeza de que '1/22 / 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 situado em um objeto de tabela aninhado. Portanto, você pode estar em uma perseguição de ganso selvagem tentando verificar cada coluna 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 em cada coluna de cada tabela. 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:
Existem algumas maneiras de torná-lo mais eficiente também.
Nesse caso, dado o valor que você está procurando, você pode eliminar claramente qualquer coluna do tipo NÚMERO ou DATA, o que reduziria o número de consultas. Talvez até restrinja a colunas onde o tipo é como '% CHAR%'.
Em vez de uma consulta por coluna, você pode criar uma consulta por tabela assim:
fonte
all_tab_columns
nãoall_tables
. Eu consertei.Fiz algumas modificações no código acima para torná-lo mais rápido se você estiver pesquisando em apenas um proprietário. Você apenas tem que alterar as 3 variáveis v_owner, v_data_type e v_search_string para ajustar o que você está procurando.
fonte
'SELECT COUNT(*) FROM "'||t.table_name||'" WHERE "'||t.column_name||'" = :1'
dbms_output
? Porque as consultas são executadas com sucesso no DataGrip, mas não vejo nenhum resultado depois.Aqui está outra versão modificada que irá comparar uma correspondência de substring inferior. Isso funciona no Oracle 11g.
fonte
Sim, você pode e seu DBA irá odiá-lo e descobrirá que você tem que pregar os sapatos no chão, porque isso causará muito I / O e reduzirá o desempenho do banco de dados à medida que o cache for eliminado.
para começar.
Eu começaria com as consultas em execução, usando o
v$session
e ov$sqlarea
. Isso muda com base na versão do oracle. Isso reduzirá o espaço e não atingirá tudo.fonte
Eu sei que este é um assunto antigo. Mas vejo um comentário sobre a questão perguntando se isso poderia ser feito em
SQL
vez de usarPL/SQL
. Então pensei em postar uma solução.A demonstração abaixo é buscar um VALOR em todas as COLUNAS de todas as TABELAS em um ESQUEMA inteiro :
Vamos procurar o valor
KING
noSCOTT
esquema.Vamos procurar o valor
20
noSCOTT
esquema.fonte
Error occurred in XML processing ORA-00932: inconsistent datatypes: expected NUMBER got BLOB
Eu faria algo assim (gera todos os selects que você precisa). Mais tarde, você pode alimentá-los no sqlplus:
Produz:
E o que ele faz é - para cada
table_name
deuser_tables
obter cada campo (de desc) e criar um SELECT * da tabela onde o campo é igual a 'val'.fonte
Modifiquei o script do Flood para ser executado uma vez para cada tabela em vez de para cada coluna de cada tabela para execução mais rápida. Requer Oracle 11g ou superior.
fonte
Eu estava tendo os seguintes problemas para a resposta de @Lalit Kumars,
A solução é:
fonte
se soubermos os nomes da tabela e da coluna, mas quisermos descobrir o número de vezes que a string está aparecendo para cada esquema:
fonte
Procedimento para pesquisar todo o banco de dados:
Executar declaração
Resultados da amostra
fonte
Não tenho uma solução simples no promprt SQL. No entanto, existem algumas ferramentas como o sapo e o PL / SQL Developer que possuem uma GUI onde um usuário pode inserir a string a ser pesquisada e retornará a tabela / procedimento / objeto onde ela foi encontrada.
fonte
Existem algumas ferramentas gratuitas que fazem esse tipo de pesquisa, por exemplo, esta funciona bem e o código-fonte está disponível: https://sites.google.com/site/freejansoft/dbsearch
Você precisará do driver ODBC Oracle e de um DSN para usar esta ferramenta.
fonte
Modificando o código para pesquisar sem distinção entre maiúsculas e minúsculas usando uma consulta LIKE em vez de encontrar correspondências exatas ...
fonte
- execução concluída - sem erro
fonte
Pegar emprestado, melhorar um pouco e simplificar a partir desta postagem do blog a seguinte instrução SQL simples parece fazer o trabalho muito bem:
fonte
fonte