Extrair objetos(TABLES,VIEWS) DE um script SQL

Boa tarde,

Preciso criar um pequeno programa que será alimentado com scripts SQL, cada script nada mais é que uma consulta em tabelas e/ou views. Tenho que pegar todos os objetos que estão contidos na consulta, um pequeno exemplo.

SELECT capa.nro_nota,
       item.descricao,
       imposto.vlr_imposto
 FROM capa
      LEFT JOIN item ON item.id_capa = capa.id_capa
	  LEFT JOIN imposto ON imposto.id_item = item.id_item

Precisaria retornar uma lista com os objetos que foram utilizados, no caso “CAPA,ITEM,IMPOSTO”. Alguém já fez algo do tipo ? ou teria uma dica para ajudar ?

Isso provavelmente tem de funcionar bem para um determinado banco de dados (digamos Oracle), certo?

Correto, os scripts são apenas para rodar em base Oracle.

Tem um jeito bem bobo (se forem poucos os scripts SQL), que é o de você criar uma procedure com essa consulta, e então perguntar quais são os objetos de que essa consulta depende (tabelas, views etc.).

Mas pelo que imagino (você quer escrever um programa) você precisa consultar muitos scripts, certo?

Sim, terei que consultar vários scripts em vários períodos.

O programa vai ser um pouco mais complexo, após retirar os objetos do script preciso popular as tabelas que fazem parte dele, quando for uma view preciso verificar as tabelas que fazem parte dela também e popular.

A parte de popular as tabelas tendo os objetos em mão é tranquila, o que não tive ideia ainda é como fazer para extrair esses objetos da consulta. Após encontrar os objetos consigo ver suas dependências através de consulta no Oracle.

Dá a impressão que, tendo uma lista de tabelas e views (você poderia obtê-la a partir do schema), você poderia usar algum parser SQL (acho que deve haver algum pronto ou quase pronto como exemplo do JavaCC ou do ANTLR) para você, reconhecendo a gramática do SQL Oracle, conseguir verificar se um determinado identificador é uma tabela ou view.
Mas talvez haja uma solução 100% Oracle para isso - infelizmente, eu procurei no Google sobre “dependent objects Oracle” e ele só me mostrou aquelas coisas óbvias, que você mesmo disse que é fácil obter.

É também não achei nada no google por isso postei aqui. Bom vamos ver se alguém já passou por isso, enquanto isso vou pesquisando e tentando montar um algoritmo aqui.

Se funcionar post aqui a solução.

Boa Tarde,

Veja no link abaixo a procedure PL/SQL feita para encontrar OBJETOS SQL em um fonte JAVA.

Atente que a procedure WHO_JAVA_XREF procura em um “fonte”, logo seus scripts podem ser também pesquisados.

http://glufke.net/oracle/search.php?keywords=who_java_xref&terms=all&author=&sc=1&sf=all&sr=posts&sk=t&sd=d&st=0&ch=300&t=0&submit=Pesquisar

Espero poder te ajudar.

Neste mesmo forum estava com estas dúvidas e acabei resolvendo o problema.

Abs, Renato Viana

…continuando, faça uma pequena atualização na procedure… – incluido o ponto:

 LOOP
   
   XZ_OK_ONDE := INSTR(UPPER(XZ_OK_DCLIN),XZ_OK_XNMOBJ,XZ_OK_ONDE,XZ_OK_VEZ);
   IF XZ_OK_ONDE > 0 THEN
     IF (XZ_OK_ONDE + XZ_OK_LEN - 1) = XZ_OK_FIM 
      OR XZ_OK_XNMOBJ || ' ' = UPPER(SUBSTR(XZ_OK_DCLIN,XZ_OK_ONDE,XZ_OK_LEN + 1))
      OR XZ_OK_XNMOBJ || '"' = UPPER(SUBSTR(XZ_OK_DCLIN,XZ_OK_ONDE,XZ_OK_LEN + 1))
      OR XZ_OK_XNMOBJ || '''' = UPPER(SUBSTR(XZ_OK_DCLIN,XZ_OK_ONDE,XZ_OK_LEN + 1))   
      OR XZ_OK_XNMOBJ || ',' = UPPER(SUBSTR(XZ_OK_DCLIN,XZ_OK_ONDE,XZ_OK_LEN + 1))  
      OR XZ_OK_XNMOBJ || ';' = UPPER(SUBSTR(XZ_OK_DCLIN,XZ_OK_ONDE,XZ_OK_LEN + 1))
      OR XZ_OK_XNMOBJ || ')' = UPPER(SUBSTR(XZ_OK_DCLIN,XZ_OK_ONDE,XZ_OK_LEN + 1))
      OR XZ_OK_XNMOBJ || '(' = UPPER(SUBSTR(XZ_OK_DCLIN,XZ_OK_ONDE,XZ_OK_LEN + 1))
      OR XZ_OK_XNMOBJ || '.' = UPPER(SUBSTR(XZ_OK_DCLIN,XZ_OK_ONDE,XZ_OK_LEN + 1)) -- incluido o ponto
     THEN
       XZ_OK_EXISTE := 1;
       RETURN TRUE;

Renato,

Vou dar uma olhada e fazer uns testes. Assim que tiver o resultado posto aqui.

Muito Obrigado !