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!
retornar a tabela em uma query
-
- Moderador
- Mensagens: 641
- Registrado em: Seg, 03 Set 2007 3:26 pm
- Localização: Fortaleza - CE
att,
Daniel N.N.
Daniel N.N.
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;
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.
- fsitja
- 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
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:
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.
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
*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.
- fsitja
- 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
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.
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 4 visitantes