测试存储过程中中发生异常时,之前DML操作会不会rollback

步骤:
1、向表中productinfo插入一条数据 
2、然后查询一个多条数据插入变量中(人为制造异常) 
3、执行存储过程,检查数据是否插入成功 

CREATE OR REPLACE PROCEDURE p_exp_test1 --创建存储过程是,存储过程关键词要有(procedure)
IS
v_productname productinfo.productname%TYPE;
BEGIN 
   INSERT INTO productinfo VALUES ('0240050499','测试',999,99,'0100010001','测试','测试');
   SELECT productname INTO v_productname FROM productinfo WHERE productid = '0240050414';

   DBMS_OUTPUT.PUT_LINE(v_productname);
   
   EXCEPTION
     WHEN TOO_MANY_ROWS THEN 
        DBMS_OUTPUT.PUT_LINE('数据过多');
END ;
--执行存储过程
BEGIN
   p_exp_test1;
END;
SELECT * FROM productinfo;
 
  

 
  
-----------------------------------------------------下面注释异常处理---------------------------------------------------------------------
1、如果把异常处理部分去掉,执行时会出现错误,导致事务中断,如果没有插入数据,表示是一个事务,并且由于
事务的连续性,事务自行回滚,如果插入表示是不同事务。
2、如果因为加上异常处理,对跳转到异常处理的操作,程序不判定为错误,顺序执行程序,事务不会自行回滚。
CREATE OR REPLACE PROCEDURE p_exp_test1 --创建存储过程是,存储过程关键词要有(procedure)
IS
v_productname productinfo.productname%TYPE;
BEGIN 
   INSERT INTO productinfo VALUES ('0240050499','测试',999,99,'0100010001','测试','测试');
   SELECT productname INTO v_productname FROM productinfo WHERE productid = '0240050414';
   DBMS_OUTPUT.PUT_LINE(v_productname);
   
   /*EXCEPTION
     WHEN TOO_MANY_ROWS THEN 
        DBMS_OUTPUT.PUT_LINE('数据过多');
        ROLLBACK;*/
END ;
--执行存储过程
BEGIN
   p_exp_test1;
END;
--查询
SELECT * FROM productinfo FOR UPDATE;




你可能感兴趣的:(数据库)