2010-11-05 84 views
1

什么是编写一个用于记录持久性的oracle包的最佳解决方案? 我一直写的是这样的:INSERT INTO + COMMIT IN包

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后提交。

Alberto

+2

概念为什么你不让错误传播?捕获错误并返回错误代码很容易出错(可以忘记检查返回值),详细(更多代码,更多参数)和重复(所有调用此过程的代码都需要检查错误)。在没有重新提出例外的情况下,几乎没有任何理由赶上“其他人”。 – 2010-11-05 13:32:11

回答

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; 
-1

默认情况下,Oracle没有自动提交,所以你必须。

+1

最好是在调用代码中提交,然后可以安全地将该过程称为事务的一部分。 – pablo 2010-11-05 15:34:27

3

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

8

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

+0

如果您确实需要,请使用SAVEPOINT http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/savepoint_statement.htm – Gaius 2010-11-07 12:54:03