存储过程执行完毕后oracle默认提交
你如果在被调用的存储过程中动用了insert,update语句
则数据便会在过程结束时默认提交
一般情况下
你的子存储过程应该分为计算过程,存储过程
在计算存储过程中只要计算,
在存储过程中进行插入修改操作

解决方案 »

  1.   

    你可以把你调用的存储过程写在你的主过程里面么!
    Create or replace procedure Main
    is 
    .
    .
    .
    .
       procedure Sub_Procedure
       end Sub_Procedure;begin
    .
    .
    .
      Sub_procedure;
    .
    .
    .end Main_Procedure;
      

  2.   

    过程1:(其中QW_GET_RND是取随机数的函数,RESET_QW_SE('')是另一个存储过程。)
    CREATE OR REPLACE PROCEDURE SET_QW(RECORDS NUMBER,DEL_FLAG VARCHAR) IS
    TMPVAR NUMBER(10);BEGIN    TMPVAR := 0;
        DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE,'rrrr-mm-dd hh24:mi:ss'));

    IF UPPER(DEL_FLAG)='DEL' THEN
    DELETE FROM QW;
    RESET_QW_SE('');
    END IF;

      FOR TMPVAR IN 1..RECORDS LOOP
       INSERT INTO QW(NAME,SCORE) VALUES ('NAME'||TRIM(TO_CHAR(TMPVAR,'000000000000000')),QW_GET_RND);
       END LOOP;
          
    COMMIT;
       
        DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE,'rrrr-mm-dd hh24:mi:ss'));
       
       EXCEPTION
         
         WHEN OTHERS THEN
       ROLLBACK;
           RAISE;
       
       
    END SET_QW;
      

  3.   

    过程2:(重设'QW_SE')
    CREATE OR REPLACE PROCEDURE RESET_QW_SE(COMMIT_FLAG VARCHAR2) ISVARTMP NUMBER;
    BEGIN SELECT COUNT(*) INTO VARTMP FROM USER_SEQUENCES WHERE SEQUENCE_NAME='QW_SE';

    IF VARTMP=1 THEN
    EXECUTE IMMEDIATE 'DROP SEQUENCE QW_SE';
    END IF;

    SELECT COUNT(*) INTO VARTMP FROM USER_SEQUENCES WHERE SEQUENCE_NAME='QW_SE';

    IF VARTMP=0 THEN
    EXECUTE IMMEDIATE 'CREATE SEQUENCE QW_SE START WITH 1 INCREMENT BY 1 NOCYCLE';
    END IF;

    IF UPPER(COMMIT_FLAG)='COMMIT' THEN
       COMMIT;
    END IF;

    EXCEPTION
    WHEN OTHERS THEN
    ROLLBACK;
    RAISE_APPLICATION_ERROR(-20001,'RESET_QW_SE ERROR');

    END RESET_QW_SE;
      

  4.   

    本来说的是针对dml语句的
    你现在执行ddl语句
    而ddl语句即使在一个存储过程中,
    只要那个语句执行,就已经不能回滚了
    rollback对他还有什么意义
    所谓皮之不存毛将焉附
      

  5.   

    竟然有DDL语句。
    岂不隐式提交呼。
      

  6.   

    是指过程'QW_SE'里的DDL语句吗?可是即便里面没有那些语句,过程1里面的那句删除命令还是不能回滚呀。
      

  7.   

    只要有DDL语句就不可以。蓝兄说的对
      

  8.   

    换一下顺序
         DELETE FROM QW;
         RESET_QW_SE('');
    换为:
         RESET_QW_SE('');
         DELETE FROM QW;