在Oracle上回滚@存储过程
发布时间:2021-02-19 04:15:57 所属栏目:百科 来源:网络整理
导读:我不知道这是否正确但由于某种原因我的存储过程在异常发生后没有回滚.所以即使我得到一个异常,我的insert语句也会被提交 我忘记了什么吗? PROCEDURE SP_USUARIO_INSERT ( pUSU_IDUSUARIO IN OUT ENG.USU_USUARIO.USU_IDUSUARIO%TYPE,pUSU_CDUSUARIO IN EN
|
我不知道这是否正确但由于某种原因我的存储过程在异常发生后没有回滚.所以即使我得到一个异常,我的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层而言,该过程已成功完成(因为异常被捕获并被忽略). 可能还有其他原因,例如 >插入在过程执行之前发生,因此在语句失败时不会回滚(并且您没有显式回滚事务)>在引发异常之前,通过显式提交提交插入. (编辑:武汉站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


