在包中插入INTO + COMMIT

时间:2010-11-05 12:40:34

标签: oracle plsql

为记录持久性编写oracle包的最佳解决方案是什么? 我总是写这样的东西:

    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;

我想知道是否必须在INSERT INTO之后进行COMMIT。

阿尔贝托

5 个答案:

答案 0 :(得分:8)

我会在过程中提交一个提交,并将其留给调用该过程的代码。这允许该过程用作较大事务的一部分。插入不是隐式提交的。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

注意,如果将提交放在包中,它将提交整个事务

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;

答案 3 :(得分:0)

您还应该看看autonomous transactions

的概念

答案 4 :(得分:-1)

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