Uso do SAVEPOINT no Oracle 11g

Posted by Emerson on 20:43 with 5 comments


Olá pessoal!
Continuando a  nossa série de posts sobre a Prova de Certificação IZO-047 - Oracle SQL Expert iremos abordar mais um assunto.O uso do SAVEPOINT.

SAVEPOINTO Savepoint é uma declaração que faz parte do TCL(Transational Control Language) que suporta os comando ROLLBACK COMMIT.Ele estabelece demarcações de pontos dentro de uma transação, a fim de capacitar qualquer COMMIT seguinte ou ROLLBACK para subdividir os pontos em que os dados podem ser salvos ou a transação desfeita.


Não entrarei em detalhes sobre COMMIT e ROLLBACK porém essas transações sem o uso do SAVEPOINT, é tudo ou nada, não existe meio termo.Se for um bloco com varias instruções a serem executadas, a série inteira pode ser salva ou desfeita em grande grupos.
Vejamos um exemplo com dados reais.
SQL> select codigo,nome,tipo from fornecedor where codigo <=10;
    CODIGO NOME                                                          TIPO
---------- ------------------------------------------------------- ----------
         1 E A M TRANSPORTES E LOGISTICA LTDA                               2
         2 A G CALCADOS E COMPONENTES LTDA                                  1
         3 A P GALVANI                                                      1
         4 ABRASIVOS VINCI LTDA                                             2
         5 ACESSORIOS MINEIRAO LTDA.                                        8
         6 ACESSORIOS PALMARES LTDA                                         8
         7 ACOTUPY -IND.METALURGICAS LTDA.                                  1
        10 AMANCO BRASIL LTDA (PRODUTOS)                                    1


8 rows selected.
SQL> commit;
SQL> update fornecedor set tipo = 10 where codigo<=10;
8 rows updated.
SQL> savepoint sp_1;
Savepoint created.


Vejamos que posteriormente ao select na tabela fiz um UPDATE atualizando o campo tipo=10.E por fim o savepoint sp_1.Definimos o nome do como sp_1, mas nada importaria que fosse qualquer um outro nome.
Outro exemplo:
SQL> update fornecedor set tipo = 25 where codigo<=25;
22 rows updated.
SQL> savepoint sp_25;
Savepoint created.
SQL> update fornecedor set tipo =35 where codigo<=25;
22 rows updated.
SQL> savepoint sp_35;
Savepoint created.
SQL> update fornecedor set tipo =45 where codigo<=25;
22 rows updated.
SQL> rollback to sp_35;
Rollback complete.
SQL>  select codigo,nome,tipo from fornecedor where codigo<=25;
    CODIGO NOME                                                          TIPO
---------- ------------------------------------------------------- ----------
         1 E A M TRANSPORTES E LOGISTICA LTDA                              35
         2 A G CALCADOS E COMPONENTES LTDA                                 35
         3 A P GALVANI                                                     35
         4 ABRASIVOS VINCI LTDA                                            35
         5 ACESSORIOS MINEIRAO LTDA.                                       35
         6 ACESSORIOS PALMARES LTDA                                        35
         7 ACOTUPY -IND.METALURGICAS LTDA.                                 35
        10 AMANCO BRASIL LTDA (PRODUTOS)                                   35
        11 AKZO NOBEL LTDA (TINTAS YPIRANGA)                               35
        12 ALAGOAS DIESEL S/A                                              35
        13 ALAMO PRENSADOS DO BRASIL S.A.                                  35
        14 ALBA QUIMICA IND. E COM. LTDA                                   35
        15 ALCAN ALUMINIO DO BRASIL S/A.                                   35
        16 ALMAK INDUSTRIA E COMERCIO LTDA                                 35
        17 ALULEV ESCADA LTDA.                                             35
        18 ALUMA ALUMINIO COM.E REP.DE M.LTDA                              35
        20 AMBROSIO E JUNIOR " MOBI "                                      35
        21 AMIR-AGRO MADEIREIRA IND. RO LTDA                               35
        22 AMORIM SERGIPE TRANSPORTES LTDA                                 35
        23 ANCOL ANJOS ENGENHARIA IND COM LTDA                             35
        24 ANDREAZZA MADEIRAS S/A                                          35
        25 ANGELL-INDUSTRIA E COMERCIO LTDA                                35
22 rows selected.
SQL> commit;


Nesse outro caso, utilizei outras marcações, mais específicamente três, sp_25,sp_35 e sp_45 e por fim dei um rollback abortando abaixo do savepoint sp_35.Uma coisa a se notar é que ao efetuar o rollback da sp_35, é como se nada que foi escrito posteriormente.
As regras de utilização SAVEPOINT incluem o seguinte:


1 - Todas as declarações SAVEPOINT deve incluir um nome.
2 - Você não deve duplicar nomes SAVEPOINT dentro de uma única transação e lembre-se que uma transação é uma série de uma ou mais declarações SQL que termina com um evento de compromisso. Se você duplicar um nome, sei que você vai não receber um erro de sintaxe ou de execução. Em vez disso, o SAVEPOINT novo simplesmente substituir o SAVEPOINT anterior, efetivamente apagá-lo.
3 - Uma vez um evento de confirmação ocorre ou ainda um evento explícito ou implícito cometer todos os pontos de salvamento existentes são apagados da memória. Quaisquer referências a eles por declarações futuras TCL irá produzir um código de erro.


SQL> savepoint sp_35;
Savepoint created.
SQL> update fornecedor set tipo =45 where codigo<=25;
22 rows updated.
SQL> savepoint to sp_5;
Rollback complete.
SQL>commit;
SQL>  rollback to sp_25;

 rollback to sp_25
*
ERROR at line 1:
ORA-01086: savepoint 'SP_25' never established in this session or is invalid

No exemplo anterior, a instrução ROLLBACK na sp_25 é errado duas razões. Um, é logicamente irrelevante, uma vez que não há nada para reverter o COMMIT com tudo salvo permanentemente.
O SAVEPOINT é particularmente útil na gestão de uma grande série de transações em que a validação incremental deve ser exigido, no qual cada indivíduo validação requer uma série complexa de instruções DML que pode falhar, mas pode ser programaticamente corrigidos e validados antes de passar para o próximo incremento.

É isso ai pessoal, espero que tenham gostado.

Até a próxima.

Emerson Martins
DBA Jr
Categories: