Achar tabelas que tenha a informação desejada

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
jhonnygabi
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qui, 26 Nov 2009 3:01 pm
Localização: valença - rio de janeiro

Tenho um sistema com 640 tabelas.
Quero encontrar a tabela que tenha os tipos de venda cadastradas:
ex: bonificação, brinde...
Quero saber os nomes das tabelas que tenha essas informações gravadas.
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

teria que fazer um loop na user_tab_columns e sair montando consultas dinamicas com execute immediate.
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Eu recomendaria um bom e velho diagrama ER. Chama o AD para um papo.

Se isso não for possível você vai suar a camisa e ainda assim pode não achar algo. Se suas tabelas tiverem comentários nas colunas fica mais simples... mas vai ter que testar... pode contar abreviatura das palavras, pode ter sido escrito errado, pode ter acento, cedilha, etc... Eu usaria expressões regulares para facilitar isso.

No exemplo abaixo estou buscando pelas palavras YES, MAXIMUM e NAME no comentário da coluna e nos nomes das colunas em si.

Selecionar tudo

select tc.owner, tc.table_name, tc.column_name, cc.comments, tc.column_name || ' - ' || cc.comments name_comment
  from all_tab_cols tc 
  left join all_col_comments cc on tc.owner = cc.owner
                             and tc.table_name = cc.table_name
                             and tc.column_name = cc.column_name
 where regexp_instr(upper(tc.column_name || ' - ' || cc.comments), '.YES.') > 0
    or regexp_instr(upper(tc.column_name || ' - ' || cc.comments), '.MAXIMUM.') > 0
    or regexp_instr(upper(tc.column_name || ' - ' || cc.comments), '.NAME.') > 0
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

você tem q ter mais alguma informacao?

quando preciso de um objeto no banco e tenho/sei muito pouco sobre este objeto eu faco isso:

Selecionar tudo

select * from all_source where text like '%tenho_isso%'
jhonnygabi
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qui, 26 Nov 2009 3:01 pm
Localização: valença - rio de janeiro

O QUE PRECISO É MAIS OU MENOS ISSO:

tenho a seguinte linha de comando:

Selecionar tudo

SELECT *
FROM all_tab_columns
WHERE upper(column_name) LIKE 'SENHA';
Essa linha me diz todas as tabelas que tenha a coluna chamada "senha"...

Preciso de algo parecido que me diga quais colunas de quais tabelas tenha uma determinada informação gravada.

ex: quando bloqueio o cliente, tenho de dar o motivo do bloquei (ex: cliente inativo). Quero saber qual tabela tem esse texto armazenado dentro de sí.
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP

Mas existe um nome fixo pra coluna aonde buscar a informação? Ou pode ser coluna de qualquer nome?

Montei um pequeno procedimento, mas pelo tamanho da sua base e dependendo de indices, tipos da coluna etc, esse procedimento pode demorar pra terminar de rodar.

Ele busca por colunas de qualquer nome, você só precisa informar os possíveis tipos pra coluna e os owners no select do "FOR" e também informa a sentença buscada na vatriável "string" localizada logo após o begin. Lembrando que quanto mais restrições melhor o desempenho!

Selecionar tudo

declare
  verifica varchar2(4000);
  string varchar2(4000);
begin
  string := upper('KING');
  for i in (select owner, table_name, column_name 
            from all_tab_columns 
            where data_type in ('VARCHAR2','CHAR','VARCHAR','NCHAR','NVARCHAR2') 
            and owner in ('HR','SCOTT'))
  loop
    verifica := null;
    begin 
      execute immediate 'select substr(' || i.column_name || ',1,4000) from ' || i.owner || '.' || i.table_name || ' where upper(' || i.column_name || ') like ''%' || string || '%'' and rownum = 1' into verifica;
      exception 
        when no_data_found then
        null;
      end;
    if (verifica is not null) then
      dbms_output.put_line('OWNER: ' || i.owner || CHR(10) || '  - TABELA: ' || i.table_name || CHR(10) || '  - COLUNA: ' || i.column_name || CHR(10));
    end if;
  end loop;
end;
/
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 5 visitantes