代码之家  ›  专栏  ›  技术社区  ›  LeftyX

在包中插入+提交

  •  1
  • LeftyX  · 技术社区  · 14 年前

        create or replace
        PACKAGE BODY           "USP_PRICELIST" AS
    
          PROCEDURE  usp_TABLE1Save 
            (
            pErrorCode              OUT NUMBER,
            pMessage                OUT VARCHAR2,       
            pPARAM1                 IN CHAR,
            pPARAM2             IN CHAR
            )
    
            IS
    
        BEGIN
    
            pErrorCode := 0;
    
            INSERT INTO TABLE1
              (PARAM1, PARAM2)
            VALUES
              (pPARAM1, pPARAM2);
            EXCEPTION
                     WHEN OTHERS THEN pErrorCode := SQLCODE; pMessage := SQLERRM;
    
        END usp_TABLE1Save;
    
    END USP_PRICELIST;
    

    我想知道插入后是否需要提交。

    阿尔贝托

    5 回复  |  直到 14 年前
        1
  •  2
  •   Harrison    14 年前

    小心,如果将提交放在包中,它将提交整个事务

    create table testcommit (colA varchar2(50)) ;
    
    DECLARE
      PROCEDURE SELFCOMMIT(VAL IN TESTCOMMIT.COLA%TYPE) AS
                    BEGIN
                         INSERT INTO TESTCOMMIT(COLA) VALUES(VAL);
                         COMMIT ;
                    END SELFCOMMIT ;
      PROCEDURE NOCOMMIT(VAL IN TESTCOMMIT.COLA%TYPE) AS
                    BEGIN
                         INSERT INTO TESTCOMMIT(COLA) VALUES(VAL);
                    END NOCOMMIT ;              
    
    
    BEGIN
      INSERT INTO TESTCOMMIT(COLA) VALUES('INITIAL');
      SELFCOMMIT('FIRST SELF COMMIT');
      ROLLBACK ; --KILL TRANSACTION
    
      INSERT INTO TESTCOMMIT(COLA) VALUES('SECOND MAIN INSERT');
      NOCOMMIT('NO AUTO COMMIT');
      ROLLBACK;
    
    
    END ;
    /
    SELECT * FROM TESTCOMMIT;
    
    -->
    COLA                                               
    -------------------------------------------------- 
    INITIAL                                            
    FIRST SELF COMMIT  
    -->NOTE THE SELFCOMMIT AFFECTS THE ENTIRE TRANSACTION, THUS RENDERING THE ROLLBACK MOOT
    
    --drop table testcommit;
    
        2
  •  8
  •   Tony Andrews    14 年前

    我会的 在过程中放入commit,并将其留给调用过程的代码。这允许将过程用作更大事务的一部分。插入未隐式提交。

        3
  •  3
  •   vc 74    14 年前

    这实际上取决于您希望操作参与事务还是原子化。

        4
  •  0
  •   EvilTeach    14 年前
        5
  •  -1
  •   McGarnagle    12 年前

    默认情况下,Oracle没有自动提交,因此您必须这样做。