REFTABLE und ROLLBACK (Befehle)

Wenn eine gespeicherte Prozedur ein Ergebnisset zurückgibt (REFTABLE), dürfen Sie im Prozedurhauptteil nicht den Befehl ROLLBACK absetzen, es sei denn, Sie setzen zuerst den Befehl COMMIT ab, um die temporäre Tabelle für REFTABLE zu erstellen. Durch Absetzen von ROLLBACK ohne einen vorherigen COMMIT-Befehl schlägt die Prozedur REFTABLE beim Ausführen fehl.

Wenn der Prozedurhauptteil den Befehl ROLLBACK enthält oder wenn Sie eine andere Prozedur aufrufen, die ROLLBACK absetzen könnte, geben Sie als bewährtes Verfahren im Prozedurhauptteil von REFTABLE als erste Anweisung den Befehl COMMIT an. Beispiel:

DEV.SCH1(ADMIN)=> CREATE OR REPLACE PROCEDURE returntwo(timestamp) RETURNS 
REFTABLE(tbl) LANGUAGE NZPLSQL AS 
BEGIN_PROC
  BEGIN
    COMMIT;
    EXECUTE IMMEDIATE 'INSERT INTO ' || REFTABLENAME ||' values (1,1)';
    EXECUTE IMMEDIATE 'INSERT INTO ' || REFTABLENAME ||' values (2,2)';
    EXECUTE IMMEDIATE 'INSERT INTO ' || REFTABLENAME ||' values (3,3)';
    COMMIT;
    EXECUTE IMMEDIATE 'INSERT INTO ' || REFTABLENAME ||' values (4,4)';
    ROLLBACK 
    RETURN REFTABLE;
  END;
END_PROC;

DEV.SCH1(ADMIN)=> EXECUTE returntwo(now()); 
 I | I2
---+----
 2 |  2
 1 |  1
 3 |  3
(3 rows)

Wie im Beispiel gezeigt, kann Ihre Prozedur den Befehl COMMIT nach Bedarf aufrufen, aber das erste COMMIT stellt sicher, dass die temporäre Tabelle für die Verarbeitung im Hauptteil vorhanden ist.

Die folgende Nachricht ist ein Beispiel für den Fehler, der auftritt, wenn ROLLBACK ohne ein vorheriges COMMIT ausgeführt wurde:

DEV.SCH1(ADMIN)=> EXECUTE returntwo(now());
NOTICE:  Error occurred while executing PL/pgSQL function RETURNTWO
NOTICE:  line 1 at SQL statement
ERROR:  Cannot use ROLLBACK from within a stored procedure which uses 
a REFTABLE without a COMMIT first.