[Dica] SQL dinâmico

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
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Pequeno exemplo de um SQL dinâmico:

Selecionar tudo

set serveroutput on

declare
   v_descr         varchar2(50);
   v_cursor        integer;
   v_tabela        varchar2(50);
   v_retorno       integer;
   v_sql           varchar2(100);
begin
   v_tabela := 'EMP';
   v_cursor := dbms_sql.open_cursor;
   v_sql    := 'select * from '||v_tabela;
   dbms_sql.parse(v_cursor,v_sql,1);
   dbms_sql.define_column(v_cursor,2,v_descr,50);  --o 2 é a sequencia do campo na query, o 50 o tamanho   
   v_retorno := dbms_sql.execute(v_cursor);  


   while dbms_sql.fetch_rows(v_cursor) <> 0 loop
         dbms_sql.column_value(v_cursor, 2 ,v_descr);  --o 2 é a sequencia do campo na query
         dbms_output.put_line(v_descr);

   end loop;

   dbms_sql.close_cursor(v_cursor);
end;
/
SMITE
ALLEN
WARD
JONES
MARTIN
BLAKE
SCOTT
TURNER
ADAMS
JAMES
FORD

PL/SQL procedure successfully completed.
Cleiton ramos
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Seg, 21 Fev 2005 11:04 am
Localização: SP
Cleiton Ramos
Analista Programador Oracle

Amigos, bom dia.
Alguém sabe como tratar uma exception dentro de um execute immediate ?? O comando que estou utilizando é o select e retorno o valor para uma variavel into.

ex:
[code]execute immediate ( select cd_param from empresa
where id_empresa = '||wempresa||')
into wcd_param;[/code]


como faço para tratar uma exception do tipo no_data_found ?? Lembrando que utilizando o execute immediate a sequencia dos comandos são diferentes do que das rotinas normais.

Grato :
:D
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Muito simples friend!
Basta colocar o exception fora do execute immediate. Veja abaixo:

Selecionar tudo

SQL> SET SERVEROUTPUT ON
SQL> 
SQL> 
SQL> DECLARE
  2    A VARCHAR2(100);
  3  BEGIN
  4    EXECUTE IMMEDIATE ('SELECT ''DEU_CERTO'' FROM DUAL WHERE DUMMY=''X''') INTO A;
  5    DBMS_OUTPUT.PUT_LINE(A);
  6  
  7  EXCEPTION WHEN NO_DATA_FOUND THEN  
  8    DBMS_OUTPUT.PUT_LINE('CAIU NO EXCEPTION');
  9  END;
 10  /
DEU_CERTO

PL/SQL procedure successfully completed.

SQL> 
SQL> 
SQL> 
SQL> 
SQL> DECLARE
  2    A VARCHAR2(100);
  3  BEGIN
  4    EXECUTE IMMEDIATE ('SELECT ''DEU_CERTO'' FROM DUAL WHERE DUMMY=''Y''') INTO A;
  5    DBMS_OUTPUT.PUT_LINE(A);
  6  
  7  EXCEPTION WHEN NO_DATA_FOUND THEN  
  8    DBMS_OUTPUT.PUT_LINE('CAIU NO EXCEPTION');
  9  END;
 10  /
CAIU NO EXCEPTION

PL/SQL procedure successfully completed.

SQL> 
Mudei a WHERE dummy='Y' pra não retornar nenhuma linha!
Responder
  • Informação
  • Quem está online

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