Consultar tabela pela descrição

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
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 317
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Pessoal,

Quando quero localizar alguma tabela no dicionário de dados do oracle geralmente faço assim:

Selecionar tudo


SELECT  TABLE_NAME,
        OWNER,
        UPPER(SUBSTR(TABLE_NAME,1,1)) AS "TIPO"
FROM ALL_TAB_COLUMNS
WHERE UPPER(SUBSTR(TABLE_NAME,1,1)) IN ('A','B','G','P','S','V')
  AND OWNER = 'DNR'
  AND UPPER(COLUMN_name) = 'MATRICULA'
  AND TABLE_NAME NOT IN ('ALL_ALL_TABLES')
  AND TABLE_NAME NOT LIKE ('%COPIA')
  AND TABLE_NAME NOT LIKE ('%COPIA_%')  
  AND TABLE_NAME NOT LIKE ('%BKP')  
  AND TABLE_NAME NOT LIKE ('%BK')    
  AND TABLE_NAME NOT LIKE ('%ESPELHO')    
  AND TABLE_NAME NOT LIKE ('%ERRO')  
  AND TABLE_NAME NOT LIKE ('%ERRO_%')
  AND TABLE_NAME NOT LIKE ('%CEL')   

Mas caso eu queira, dá pra consultar as tabelas no dicionário de dados do oracle, mas pela descrição das mesmas. É possível? Se sim, como eu faço?

Grato e atenciosamente,
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Tinho,

Uma coisa .. existem diferenças entre as views de dicionário "ALL_", "USER_" e "DBA_"

- "USER_": Corresponde aos objetos pertencentes ao usuario corrente (a sessão onde você executa as queries);
- "ALL_" : Além dos objetos do usuário, permite verificar os demais objetos aos quais este usuário tem acesso;
- "DBA_" : É a visão mais completa de todas, listando os objetos aos quais o usuário tem ou não acesso;

Eu recomendo que você use preferencialmente as visões USER_ ou DBA_. A visão "ALL_" pode deixar de mostrar alguma coisa que seu usuário logado não tenha acesso.

Bem .. sobre a sua pergunta, acho que você deve estar perguntando se é possível acessar as DESCRICOES de TABELAS e COLUNAS armazenadas no dicionário de dados.

Se for este o caso, existem duas views de dicionário de dados que recuperam as descrições das tabelas e colunas. Isso, desde que você tenha populado estas informações com os comandos "COMMENT ON TABLE " e "COMMENT ON COLUMN".

O nome destas visões são DBA_TAB_COMMENTS e DBA_COL_COMMENTS (existem também as ALL_ e USER_).

Não sei se a sua dúvida era exatamente este. Se não for, por favor continue atualizando este tópico.

Abraços,

Sergio Coutinho
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 317
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Bom dia, obrigado pelos esclarecimentos quanto aos tipos de visões. Eu sabia que davam acesso a visões diferentes, mas me confundia em comparação um com o outro, mas senão me engano eu não tenho acesso as view de DBA. Vou testar depois.

Quanto as views de comentário eu não as conhecia, mas além de querer ver os comentários eu preciso consultar as tabelas pelo próprio comentário. Entendeu? Eu ainda não testei essas views mas os comentários provavelmente devem estar associados as tabelas (parece obvio), ou eu preciso relacionar com as views de tabela?

Por que no meio caso é o seguinte, além das tabelas serem "gringas" os nomes não são muito sugestivos, as mesmas são identificadas por letras e números (código) que são associados a cada funcionalidade e/ou tela do front-end. E como não temos muita documentação formal e nem um DER, eu acredito que ficaria mais fácil procurar as tabelas pelos comentários. Sacou?

Grato.
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 317
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Galera,

Não respondi antes porque eu estava sem tempo. Mas agradeço a ajuda de todos. No meu caso fiz o seguinte script abaixo para atender a minhas necessidades:

Selecionar tudo


SELECT C.TABLE_NAME,
       C.OWNER,
       C.COLUMN_NAME,
       UPPER(SUBSTR(C.TABLE_NAME,1,1)) AS "TIPO",
        
       T.TABLE_NAME,
       T.OWNER,
       T.TABLE_TYPE,
       T.COMMENTS
  FROM ( SELECT CM.*
           FROM ( SELECT *  
                    from DBA_TAB_COMMENTS 
                    where (    COMMENTS <> ' ' 
					        OR COMMENTS IS NOT NULL )
                      AND OWNER NOT IN ('SYS','SYSTEM')
                ) CM
          WHERE CM.OWNER = 'OWNER'
        ) T,
       ( SELECT *
           FROM DBA_TAB_COLUMNS 
          WHERE UPPER(SUBSTR(TABLE_NAME,1,1)) IN ('A','B','G','P','S','V')
            --AND TABLE_NAME            = 'TABELA'     
            --AND UPPER(COLUMN_name) LIKE 'COLUNA%'
       ) C
  WHERE T.OWNER       = C.OWNER
    AND T.TABLE_NAME  = C.TABLE_NAME  
    AND UPPER(TRIM(T.COMMENTS)) LIKE UPPER(TRIM('%TABELA%'))

Abçs.,
Responder
  • Informação