在Oracle上回滚@存储过程

我不知道这是否正确但由于某种原因我的存储过程在异常发生后没有回滚.所以即使我得到一个异常,我的insert语句也会被提交

我忘记了什么吗?

PROCEDURE SP_USUARIO_INSERT
        (
          pUSU_IDUSUARIO          IN OUT ENG.USU_USUARIO.USU_IDUSUARIO%TYPE,pUSU_CDUSUARIO          IN ENG.USU_USUARIO.USU_CDUSUARIO%TYPE,pPES_IDPESSOA           IN ENG.USU_USUARIO.PES_IDPESSOA%TYPE,pUSU_DLSENHA            IN ENG.USU_USUARIO.USU_CDUSUARIO%TYPE,pUSU_DLOBSERVACAO       IN ENG.USU_USUARIO.USU_DLOBSERVACAO%TYPE,pUSU_NUIP               IN ENG.USU_USUARIO.USU_NUIP%TYPE,pUSU_DTCADASTRO         IN ENG.USU_USUARIO.USU_DTCADASTRO%TYPE,pUSU_DTDESATIVACAO      IN ENG.USU_USUARIO.USU_DTDESATIVACAO%TYPE,pUSU_DTULTIMOACESSO     IN ENG.USU_USUARIO.USU_DTULTIMOACESSO%TYPE,pUSU_DLMAQUINA          IN ENG.USU_USUARIO.USU_DLMAQUINA%TYPE,pUSU_STNOVO             IN ENG.USU_USUARIO.USU_STNOVO%TYPE,pUSU_STATIVO            IN ENG.USU_USUARIO.USU_STATIVO%TYPE
        )
IS
screateuser Varchar(200);
bUsuarioExiste Number;
eUsuarioExiste Exception;
BEGIN
       SELECT 
               COUNT(usu_cdusuario) 
               INTO bUsuarioExiste 
        FROM ENG.USU_USUARIO 
        WHERE USU_CDUSUARIO = pUSU_CDUSUARIO;

        IF(bUsuarioExiste > 0) THEN
              RAISE eUsuarioExiste;
        END IF;

        SELECT usu_seq.nextval INTO pUSU_IDUSUARIO FROM DUAL;

        INSERT INTO ENG.USU_USUARIO
             (
                USU_IDUSUARIO,USU_CDUSUARIO,PES_IDPESSOA,USU_DLOBSERVACAO,USU_NUIP,USU_DTCADASTRO,USU_DTDESATIVACAO,USU_DTULTIMOACESSO,USU_DLMAQUINA,USU_STNOVO,USU_STATIVO
             )
        VALUES
             (
                pUSU_IDUSUARIO,pUSU_CDUSUARIO,pPES_IDPESSOA,pUSU_DLOBSERVACAO,pUSU_NUIP,sysdate,pUSU_DTDESATIVACAO,pUSU_DTULTIMOACESSO,pUSU_DLMAQUINA,pUSU_STNOVO,pUSU_STATIVO 
             ) ;
        screateuser := 'CREATE USER ' || pUSU_CDUSUARIO || ' IDENTIFIED BY ' || pUSU_DLSENHA;
        EXECUTE IMMEDIATE screateuser;
        EXECUTE IMMEDIATE 'GRANT ENG_GERAL TO ' || pUSU_CDUSUARIO;
        COMMIT;
EXCEPTION
       WHEN eUsuarioExiste THEN
             RAISE_APPLICATION_ERROR (-20001,'Usuário já existe ou possui nome inválido.');
             ROLLBACK;
       WHEN OTHERS THEN
             RAISE_APPLICATION_ERROR (-20001,sqlCODE || ': ' || sqlERRM);
             ROLLBACK;
END SP_USUARIO_INSERT;

解决方法

我怀疑你正在“处理”(或更准确地说,忽略)你的异常.

create table temp (id number);
DECLARE
  v_str VARCHAR2(2);
BEGIN
  INSERT INTO temp VALUES (1);
  v_str := '123';
EXCEPTION
  WHEN VALUE_ERROR THEN DBMS_OUTPUT.PUT_LINE('Whoops');
END;
/
select * from temp;

显示该行,因为就sql层而言,该过程已成功完成(因为异常被捕获并被忽略).

可能还有其他原因,例如

>插入在过程执行之前发生,因此在语句失败时不会回滚(并且您没有显式回滚事务)>在引发异常之前,通过显式提交提交插入.

相关文章

Java Oracle 结果集是Java语言中处理数据库查询结果的一种方...
Java AES和Oracle AES是现代加密技术中最常使用的两种AES加密...
Java是一种广泛应用的编程语言,具备可靠性、安全性、跨平台...
随着移动互联网的发展,抽奖活动成为了营销活动中不可或缺的...
Java和Oracle都是在计算机领域应用非常广泛的技术,他们经常...
Java 是一门非常流行的编程语言,它可以运行于各种操作系统上...