Emulering av Oracle-paketets variabler

Oracle har stöd för inkapsling av variabler, typer, lagrade procedurer och funktioner i ett paket. När du konverterar Oracle-paket måste du konvertera:

  • Procedurer och funktioner – både offentliga och privata
  • Variabler
  • Cursors
  • Initieringsrutiner

Den här artikeln beskriver hur SQL Server Migration Assistant (SSMA) för Oracle konverterar paketvariabler till SQL Server.

Grundläggande om konvertering

För att lagra paketvariabler använder SSMA för Oracle lagrade procedurer som finns i ett särskilt ssma_oracle schema tillsammans med ssma_oracle.db_storage en tabell. Den här tabellen filtreras efter (sessionsidentifierare SPID ) och inloggningstid. Med den här filtreringen kan du skilja mellan variabler för olika sessioner.

I början av varje konverterad paketprocedur anropar SSMA den ssma_oracle.db_check_init_package särskilda proceduren, som kontrollerar om paketet initieras och initierar det om det behövs. Varje initieringsprocedur rensar lagringstabellen och anger standardvärden för varje paketvariabel.

Exempel

Tänk dig följande exempel för att konvertera flera paketvariabler:

CREATE OR REPLACE PACKAGE MY_PACKAGE
IS
    space varchar(1) := ' ';
    unitname varchar(128) := 'My Simple Package';
    ts date := sysdate;
END;

SSMA konverterar den till följande Transact-SQL kod:

CREATE PROCEDURE dbo.MY_PACKAGE$SSMA_Initialize_Package
AS
BEGIN
    EXECUTE ssma_oracle.db_clean_storage

    EXECUTE ssma_oracle.set_pv_varchar
        DB_NAME(),
        'DBO',
        'MY_PACKAGE',
        'SPACE',
        ' '

    EXECUTE ssma_oracle.set_pv_varchar
        DB_NAME(),
        'DBO',
        'MY_PACKAGE',
        'UNITNAME',
        'My Simple Package'

    DECLARE
        @temp datetime2

    SET @temp = sysdatetime()

    EXECUTE sysdb.ssma_oracle.set_pv_datetime2
      DB_NAME(),
      'DBO',
      'MY_PACKAGE',
      'TS',
      @temp
END

Emulering av Get- och Set-metoder för paketvariabler

Oracle använder Get och Set metoder för paketvariablerna för att undvika att låta andra underprogram läsa och skriva dem direkt. Om det finns ett krav på att vissa variabler ska vara tillgängliga mellan underprogramanrop i samma session behandlas dessa variabler som globala variabler.

För att övervinna den här omfångsregeln använder SSMA för Oracle lagrade procedurer som ssma_oracle.set_pv_varchar för varje variabeltyp. För åtkomst till dessa variabler använder SSMA en uppsättning transaktionsoberoende get_* och set_* procedurer och funktioner.

Datatyp i Oracle SSMA-procedur Set
VARCHAR ssma_oracle.set_pv_varchar
DATUM ssma_oracle.set_pv_datetime2
CHAR ssma_oracle.set_pv_varchar
INT ssma_oracle.set_pv_float
FLOAT ssma_oracle.set_pv_float

För att skilja mellan variabler från olika sessioner lagrar SSMA variablerna tillsammans med deras SPID (sessionsidentifierare) och sessionens inloggningstid. Således håller get_* och set_* procedurerna variablerna oberoende av de sessioner som kör dem.