Se for para tratar o caso de onde o delete não ocorre, basta fazer um:

if sql%rowcount = 0 then
rollback;
end if;

Agora no caso de "dar pau", você vai ter que instrumentar o código com um bloco 
exception. Exemplo simplificado:

begin
insert into log values (...) ;
delete from tabela where x = ...;
if sql%rowcount = 0 then rollback;
end if;
commit;

exeception
when others then rollback;
end;
/

Talvez seja mais elegante declarar uma exceção e lançar ela no caso do 
sql%rowcount ser igual a 0... mas enfim, o estilo de código fica por sua conta 
e/ou pelas regras do seu projeto.

Também note que deixar controle de transações (commit / rollback) dentro de uma 
sp pode causar muitos problemas se esta for chamada por outras sps. Eu não 
necessariamente usaria esta abordagem, só fiz o exemplo assim para ficar 
compatível com o seu código.

Paulo

--- Em qua, 28/12/11, Giovanni Ferreira de Sousa <giovanni.so...@funasa.gov.br> 
escreveu:

De: Giovanni Ferreira de Sousa <giovanni.so...@funasa.gov.br>
Assunto: [oracle_br] Tratamento de logs
Para: oracle_br@yahoogrupos.com.br
Data: Quarta-feira, 28 de Dezembro de 2011, 10:56

Bom Dia galera,
 
 
Estou com a seguinte situação aqui no trabalho: 
 
Um usuário solicitou que para as deleções físicas no banco, esses registros 
deletado deveriam ser armazendos em uma tabela de log. No schema da aplicação 
existe uma procedure que faz o delete nas tabelas. Para atender a demanda do 
usuário foi adicionado na procedure o insert na tabela de log, baseado no 
registro que será deletado, como segue no exemplo abaixo. Sendo assim gostaria 
da ajuda de vocês para o seguinte:
 
Após o INSERT é feito o DELETE.
 
SE o DELETE der PAU ou não for feito. Como faço pra dar ROLLBACK(no INSERT 
anterior)?
 
 
 
CREATE OR REPLACE PROCEDURE DBSISMAC.sp_solicitacao_remanej_final (
   estado        IN NUMBER,
   usuario       IN NUMBER,
   competencia   IN NUMBER,
   DS_USERNAME   IN VARCHAR2)
IS
BEGIN
INSERT INTO DBSISMAC.TL_TMQUADRO_06
      SELECT competencia AS NU_COMPETENCIA_SOLICITACAO,
             CO_GESTAO,
             CO_MUNICIPIO_IBGE,
             CO_CNES,
             NO_UNIDADE,
             NU_CONTRATO,
             DT_PUBLIC_EXT_CONTRATO,
             VL_TOTAL_FNS,
             CO_PROTOCOLO,
             CO_USUARIO,
             DT_ALTERACAO,
             DS_USERNAME AS DS_USERNAME,
             'EXCLUÍDO' AS DS_OPERACAO,
             SYSDATE AS DT_OPERACAO
        FROM DBSISMAC.TM_QUADRO_06
       WHERE SUBSTR (CO_MUNICIPIO_IBGE, 0, 2) = estado;
 
   DELETE FROM DBSISMAC.TM_QUADRO_06
         WHERE SUBSTR (CO_MUNICIPIO_IBGE, 0, 2) = estado;
   COMMIT;
END;
/
 
Atenciosamente,
 
Giovanni


[As partes desta mensagem que não continham texto foram removidas]



------------------------------------

--------------------------------------------------------------------------------------------------------------------------
>Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira 
>responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--------------------------------------------------------------------------------------------------------------------------
>Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » 
>Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: 
>http://www.oraclebr.com.br/  
------------------------------------------------------------------------------------------------------------------------
 Links do Yahoo! Grupos




[As partes desta mensagem que não continham texto foram removidas]

Responder a