[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
  

Mensagemem Ter, 18 Mai 2004 7:32 pm

Pequeno exemplo de um SQL dinâmico:

Código: Selecionar todos
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.
dr_gori
Localização: Portland, OR USA

Thomas F. G

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

Mensagemem Sex, 06 Mai 2005 10:19 am

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
Cleiton ramos
Localização: SP

Cleiton Ramos
Analista Programador Oracle

Mensagemem Qui, 12 Mai 2005 4:50 pm

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

Código: Selecionar todos
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!
dr_gori
Localização: Portland, OR USA

Thomas F. G

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


  • Veja também
    Respostas
    ExibiÇões
    Última mensagem


    Voltar para PL/SQL

    Quem está online

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