retornar a tabela em uma query

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
martini
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Seg, 14 Mai 2012 3:06 pm

Boa Tarde Doutores

Preciso desenvolver uma query que retorne o nome das tabelas utilizadas em outra query.

Exemplo:
tenho a seguinte consulta armazenada em um campo varchar, digamos na coluna DS_SQL da tabela RELATORIO, como se fosse um texto qualquer.
SELECT A.NOME,
B.CPF
FROM PESSOA_FISICA A,
COMPLEMENTO B
WHERE .....

Preciso criar uma consulta na tabela RELATORIO que me retorne essas tabelas 'PESSOA_FISICA' e 'COMPLEMENTO'.
Lembrando que na tabela RELATORIO podem haver outros registros com tabelas diferente.

Poderiam me ajudar?

Abraço!
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Selecionar tudo

DECLARE
v_sql VARCHAR2(300) := 'SELECT A.NOME,B.CPF FROM PESSOA_FISICA A, COMPLEMENTO B WHERE .....';
v_tabelas VARCHAR2(100);
BEGIN
SELECT SUBSTR(&v_sql,
       instr(upper(&v_sql),'FROM') +5,
       instr(upper(&v_sql),'WHERE') - instr(upper(&v_sql),'FROM') - 5)     
  INTO v_tabelas
  FROM dual;
DBMS_OUTPUT.put_line(  v_tabelas ) ;
END;
Restrições:
1- Seu select deve SEMPRE vir no formato SELECT ... FROM .... WHERE.
2- TEM que ter WHERE.
3- Ele não vai separando as tabelas, ele pega apenas o texto da parte das tabelas.

Não atendendo acho que já deu para pegar a idéia.
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

Uma forma de fazer seria usando o explain plan e buscando na PLAN_TABLE as tabelas identificadas no plano de acesso do Oracle. Algo assim deve servir:

Selecionar tudo

SQL> set serveroutput on
SQL> DECLARE
  2    v_sql VARCHAR2(4000) := 'select e.*
  3                              from emp e
  4                              left join depto d on d.deptno = e.deptno
  5                             where e.job = ''MANAGER''
  6                                   and exists (select 1 from dual)';
  7    v_stmt_id VARCHAR2(30) := 'meu_sql';
  8  BEGIN
  9    EXECUTE IMMEDIATE 'explain plan set statement_id = ''' || v_stmt_id || ''' for ' || v_sql;
 10    FOR cur_sql IN (SELECT object_owner owner, object_name table_name
 11                      FROM plan_table
 12                     WHERE object_type = 'TABLE'
 13                           AND statement_id = v_stmt_id)
 14    LOOP
 15      dbms_output.put_line(cur_sql.owner || '.' || cur_sql.table_name);
 16    END LOOP;
 17  END;
 18  /
 
FSITJA.EMP
FSITJA.DEPTO
 
PL/SQL procedure successfully completed
Caso esteja em procedure o código, o schema dono da procedure precisa ter grant de select nas tabelas para poder rodar o explain plan, usando definer's rights (padrão no PL/SQL).

*EDIT* OBS: Repare que DUAL não aparece na lista de tabelas usadas pois o banco de dados faz uma operação de FAST DUAL, logo ele não lê da "tabela DUAL" em si.
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

Esqueci de mencionar: no exemplo que fiz usei valor = 'MANAGER' fixo no WHERE, mas funciona da mesma forma também com bind variables, que é provavelmente o que você deve estar utilizando nos SQLs.
Responder
  • Informação
  • Quem está online

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