在Oracle上回滚@存储过程

在Oracle上回滚@存储过程,第1张

概述我不知道这是否正确但由于某种原因我的存储过程在异常发生后没有回滚.所以即使我得到一个异常,我的insert语句也会被提交 我忘记了什么吗? PROCEDURE SP_USUARIO_INSERT ( pUSU_IDUSUARIO IN OUT ENG.USU_USUARIO.USU_IDUSUARIO%TYPE, pUSU_ 我不知道这是否正确但由于某种原因我的存储过程在异常发生后没有回滚.所以即使我得到一个异常,我的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        )ISscreateuser 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层而言,该过程已成功完成(因为异常被捕获并被忽略).

可能还有其他原因,例如

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

总结

以上是内存溢出为你收集整理的在Oracle上回滚@存储过程全部内容,希望文章能够帮你解决在Oracle上回滚@存储过程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/1165096.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-01
下一篇2022-06-01

发表评论

登录后才能评论

评论列表(0条)

    保存