Translate

terça-feira, 25 de fevereiro de 2014

SQL DINÂMICO

Somente instruções DML (select, insert, update, delete... ) podem ser utilizadas em blocos PL/SQL.
Quando preciamos criar uma estrutura DDL ou DML em tempo de execução, usamos o SQL Dinâmico.

Para utilizar a SQL Dinâmica na PL/SQL pode-se usar duas técnicas, a BDMS_SQL e a SQL Dinâmica nativa.

EX SQL Dinâmica Nativa: 

declare

  v_sql   varchar2(300);
  v_plsql varchar2(300);
  
begin

    execute immediate 'create table teste_sql_din(coluna varchar2(10))';
  
    for reg in 1..50 loop
      v_sql:= 'insert into teste_sql_din
               values ('||reg||')';
               
      EXECUTE IMMEDIATE v_sql;         
    end loop;
    
    v_plsql:= 'begin
                 for reg in (select * from teste_sql_din) loop
                   dbms_output.put_line(reg.coluna);
                 end loop;
               end;';
    
    EXECUTE IMMEDIATE v_plsql; 
    
    EXECUTE IMMEDIATE 'drop table teste_sql_din';

end;

-----------------------------------------------------------------
Criar uma tabela através de uma procedure:

create or replace procedure prc_create_table
                           (p_nome_tabela varchar2
                           ,p_colunas     varchar2) is
                                            
                                            
begin

  EXECUTE IMMEDIATE 'create table '||p_nome_tabela||' (' ||p_colunas||' )'; 

end;


-- Chamando a procedure
begin

  prc_create_table('tabela_teste','coluna1 number , coluna2 varchar2(10)');

end;
-----------------------------------------------------------------
Deletar linhas de uma tabela:

Create or replace function fnc_deletar_linhas(p_tabela varchar2) return number is

begin
  EXECUTE IMMEDIATE 'delete '||p_tabela;
  
  return sql%rowcount;
end;

-- Chamando a função
begin
  dbms_output.put_line(fnc_deletar_linhas('tabela_teste')||' linhas deletadas');
end;


----------------------------------------------------------------
Inserir linhas na tabela Regions(2 colunas)
create or replace procedure prc_insere_linhas(p_tabela  varchar2
                                             ,p_coluna1 number
                                             ,p_coluna2 varchar2) is
                                             
begin
  EXECUTE IMMEDIATE 'insert into ' ||p_tabela|| ' values (:1, :2)' using p_coluna1, p_coluna2;
end;

-- chamando a procedure
begin
  prc_insere_linhas('regions',5, 'teste');
end;

Nenhum comentário:

Postar um comentário