INSERT INTO + COMMIT в пакетах - PullRequest
       1

INSERT INTO + COMMIT в пакетах

1 голос
/ 05 ноября 2010

Как лучше всего написать пакет 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;

и мне было интересно, должен ли я выполнить COMMIT после INSERT INTO.

Альберто

Ответы [ 5 ]

8 голосов
/ 05 ноября 2010

Я бы не поместил бы коммит в процедуру и оставил бы это коду, который вызывает процедуру.Это позволяет использовать эту процедуру как часть более крупной транзакции.Вставка не зафиксирована неявным образом.

3 голосов
/ 05 ноября 2010

Это действительно зависит от того, хотите ли вы, чтобы ваша операция участвовала в транзакции или была атомарной.

2 голосов
/ 05 ноября 2010

Будьте осторожны, если вы поместите коммит в пакет, он совершит всю транзакцию

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;
0 голосов
/ 05 ноября 2010

Вам также следует взглянуть на концепцию автономных транзакций

0 голосов
/ 05 ноября 2010

По умолчанию Oracle не имеет автоматической фиксации, поэтому вы должны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...