EXECUTE IMMEDIATE

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
cleberz
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 107
Registrado em: Ter, 15 Nov 2011 8:42 am

Pessoal, estou fazendo um DELETE e um INSERT:

EXECUTE IMMEDIATE 'delete...

EXECUTE IMMEDIATE 'insert...

O primeiro irá deletar 500.000 linhas e o segundo irá inserir 800.000 linhas.

Como eu faço para fazer um COMMIT a cada 3.000 linhas deletadas e inseridas?
tora34
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 108
Registrado em: Qua, 12 Nov 2008 6:01 pm
Localização: Campo Mourão PR
Renato Pasquini
Oracle Developer

Bom dia,
a clausula where será montada em tempo de execução? por isso você optou em utilizar ddl dinâmico (insert/delete via execute immediate)?
--
cleberz
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 107
Registrado em: Ter, 15 Nov 2011 8:42 am

Exatamente! a clausula where e também a from.
tora34
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 108
Registrado em: Qua, 12 Nov 2008 6:01 pm
Localização: Campo Mourão PR
Renato Pasquini
Oracle Developer

bom dia,

acho que este artigo pode ajudar.
http://www.oracle.com/technetwork/pt/ar ... 2-ptb.html
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 317
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Você deve utilizar o FORALL.

Abç.,
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Hum,

Você também poderia colocar dentro do EXECUTE IMMEDIATE um BLOCO ANONIMO PL/SQL, onde você poderia elaborar uma lógica completa para a limpeza/inclusão da tabela, com COMMIT a cada X registros.

Seria algo do tipo :

Selecionar tudo

EXECUTE IMMEDIATE  'DECLARE ' ||
'  W_CONTADOR NUMBER(12) := 0; '||
'  CURSOR cv_limpeza IS '||
'    ... '||
'BEGIN '||
'    OPEN cv_limpeza;'||
'    LOOP'||
'        FETCH ...'||
'        EXIT WHEN ..'||
'        DELETE FROM ...'||
'        w_CONTADOR := W_CONTADOR + SQL%ROWNUM; '||
'        IF W_CONTADOR >= 10000 THEN '||
'             COMMIT; '||
'             W_CONTADOR := 0; '||
'         END IF; '||
'    END LOOP;'||
'    CLOSE cv_limpeza;'||
'END'
USING <variáveis bind>;
Este bloco PL/SQL "talvez" fosse mais performático se você usasse:

- Collections (FETCH ... BULK COLLECT .. LIMIT ... / FORALL);
- Variáveis Bind;

Abraços,

Sergio Coutinho
Responder
  • Informação
  • Quem está online

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