Freigeben über


O2SS0205: PRAGMA-AUTONOMOUS_TRANSACTION kann nicht konvertiert werden (Fehler)

In diesem Artikel werden einige der Gründe erläutert, warum der SQL Server-Migrations-Assistent (SSMA) für Oracle die PL/SQL-Blöcke PRAGMA AUTONOMOUS_TRANSACTION , die Eine Anweisung auf Blockebene enthalten (d. h. eigenständig BEGIN ... END), nicht konvertiert.

Hintergrund

Mit autonomen Transaktionen können Sie eine neue Untertransaktion erstellen, die Änderungen unabhängig von der übergeordneten Transaktion übernehmen oder zurücksetzen kann. PRAGMA bezieht sich auf eine Compilerdirektive und wird verwendet, um eine Anweisung für den Compiler bereitzustellen.

Wenn Sie in Oracle einen PL/SQL-Block als autonome Transaktion definieren, wird die DML in diesem Block vom Transaktionskontext des Aufrufers isoliert. Der Block wird zu einer unabhängigen Transaktion, die von einer anderen Transaktion gestartet wird, die als Standard Transaktion bezeichnet wird. Um einen PL/SQL-Block als autonome Transaktion zu markieren, schließen Sie die folgende Anweisung in Ihren Deklarationsbereich ein:

PRAGMA AUTONOMOUS_TRANSACTION;

In der vorherigen Anweisung kann eine autonome Transaktion innerhalb eines PL/SQL-Blocks zwischen einer und END einer BEGIN Anweisung ausgeführt werden, PRAGMA ohne dass die gesamte Transaktion beeinträchtigt wird.

Wenn SSMA versucht, den PL/SQL-Block mit PRAGMA AUTONOMUS_TRANSACTION Anweisung (d. h. eigenständig BEGIN ... END) zu konvertieren, wird er nicht auf der Blockebene unterstützt PRAGMA . Dies liegt daran, dass SSMA das entsprechende Objekt in SQL Server nicht finden kann. SSMA kann jedoch autonome Transaktionen auf Routineebene konvertieren (d. h. für Prozeduren, Funktionen usw.).

Beispiel

Betrachten Sie das folgende Beispiel:

DECLARE
    PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    FOR i IN 3 .. 10 LOOP
        INSERT INTO at_test (id, description)
        VALUES (i, 'Description for ' || i);
    END LOOP;

    COMMIT;
END;

Wenn SSMA versucht, den vorherigen PL/SQL-Block zu konvertieren, gibt es folgende Fehlermeldung:

O2SS0205: PRAGMA-AUTONOMUS_TRANSACTION kann nicht konvertiert werden.

Mögliche Abhilfen

Um einen PL/SQL-Block mit einer AUTONOMOUS_TRANSACTION Anweisung zu konvertieren, sollten Sie den Code in eine Prozedur, Funktion oder Trigger umschließen. Im vorherigen Beispiel können Sie eine Prozedur zum Einfügen der Daten in die at_test Tabelle als autonome Transaktion definieren. Die Lösung für das vorherige Problem lautet wie folgt:

CREATE OR REPLACE PROCEDURE Insert_Data
AS
    PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    FOR i IN 3 .. 10 LOOP
        INSERT INTO at_test (id, description)
        VALUES (i, 'Description for ' || i);
    END LOOP;

    COMMIT;
END;

So konvertiert SSMA eine autonome Transaktion

Um die vorherige autonome Transaction-Anweisung zu konvertieren, verwendet SSMA den Emulator xp_ora2ms_exec2_exfür die erweiterte gespeicherte Prozedur. Nachdem SSMA den autonomen Block als separate Prozedur erstellt hat, wird diese Prozedur mithilfe des xp_ora2ms_exec2_ex Emulators aufgerufen, wie im folgenden Beispiel gezeigt.

BEGIN
    DECLARE
        @active_spid INT,
        @login_time DATETIME

    SET @active_spid = ssma_oracle.get_active_spid()
    SET @login_time = ssma_oracle.get_active_login_time()

    EXECUTE master.dbo.xp_ora2ms_exec2_ex
        @active_spid,
        @login_time,
        DB_NAME(),
        N'DBO',
        N'INSERT_DATA$IMPL',
        N'false'
END

Stellt intern xp_ora2ms_exec2_ex eine Verbindung mit derselben Instanz von SQL Server mithilfe aktueller Anmeldeinformationen her und führt die angegebene gespeicherte Prozedur aus (INSERT_DATA$IMPL im vorherigen Beispiel). Da es sich um eine separate Verbindung ist, können Änderungen, die durch die ausgeführte gespeicherte Prozedur durchgeführt werden, getrennt von der aufrufenden Transaktion zugesichert oder zurückgesetzt werden.

Da eine neue Verbindung mit SQL Server geöffnet werden muss, ist diese Konvertierung im Vergleich zu nativen Oracle-Implementierungen relativ langsam. Wenn möglich, schreiben Sie den Code ohne die autonome Transaktion um.

  • O2SS0292: PRAGMA AUTONOMUS_TRANSACTION konvertiert
  • O2SS0308: PRAGMA AUTONOMOUS_TRANSACTION ignoriert