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 ?
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.