2017-02-08 2 views
2

Ich muss eine PL/SQL-Prozedur schreiben, innerhalb dieser Prozedur muss ich eine andere Prozedur innerhalb ihrer eigenen Transaktionsgrenzen aufrufen und sie unabhängig von Fehler oder Commit der Haupttransaktion festschreiben. Mit anderen Worten brauche ich etwas wie REQUIRES NEW Transaktionsausbreitung.Wie man individuelle Transaktion in Oracle PLSQL festlegt

Etwas wie:

procedure mainProcedure(arugements) is 
begin 
    // some statements 
    nestedProcedure(someArguments); 
    // some other statements 
end; 

procedure nestedProcedure(arguments) is 
begin 
    // start a new transaction 
    // some statements, lock some objects! 
    // commit the new transaction and release locked objects 
end; 

Wie kann ich das erreichen?

Antwort

2

Sie können pragma autonomous_transaction verwenden. Es macht das gleiche, was Sie brauchen. Aber vergessen Sie nicht, dass Sie in der Untertransaktion keine Aktualisierungen von oben

procedure mainProcedure(arugements) is 
begin 
    // some statements 
    nestedProcedure(someArguments); 
    // some other statements 
end; 

procedure nestedProcedure(arguments) is 
pragma autonomous_transaction; 
begin 
    // start a new transaction 
    // some statements, lock some objects! 
    // commit the new transaction and release locked objects 
    commit; 
end; 
sehen
6

Werfen Sie einen Blick auf Autonomous transation. Siehe auch Demo

CREATE TABLE t (
test_value VARCHAR2(25)); 

CREATE OR REPLACE PROCEDURE child_block IS 
PRAGMA AUTONOMOUS_TRANSACTION; 
BEGIN 
    INSERT INTO t 
    (test_value) 
    VALUES 
    ('Child block insert'); 
    COMMIT; 
END child_block; 
/

CREATE OR REPLACE PROCEDURE parent_block IS 

BEGIN 
    INSERT INTO t 
    (test_value) 
    VALUES 
    ('Parent block insert'); 

    child_block; 

    ROLLBACK; 
END parent_block; 
/

Ausführung:

-- empty the test table 
    TRUNCATE TABLE t; 

    -- run the parent procedure 
    exec parent_block; 

    -- check the results 
    SELECT * FROM t; 
Verwandte Themen