Émulation des variables de package Oracle

Oracle prend en charge l’encapsulation de variables, de types, de procédures stockées et de fonctions dans un package. Lorsque vous convertissez des packages Oracle, vous devez convertir :

  • Procédures et fonctions - public et privé
  • Variables
  • Cursors
  • Routines d’initialisation

Cet article explique comment l’Assistant Migration SQL Server (SSMA) pour Oracle convertit les variables de package en SQL Server.

Principes de base de la conversion

Pour stocker des variables de package, SSMA pour Oracle utilise des procédures stockées qui résident dans un schéma spécial ssma_oracle avec la table ssma_oracle.db_storage. Cette table est filtrée par (identificateur de session) et l’heure SPID de connexion. Ce filtrage vous permet de faire la distinction entre les variables de différentes sessions.

Au début de chaque procédure de package convertie, SSMA place un appel à la ssma_oracle.db_check_init_package procédure spéciale, qui vérifie si le package est initialisé et l’initialise si nécessaire. Chaque procédure d’initialisation nettoie la table de stockage et définit les valeurs par défaut pour chaque variable de package.

Exemple

Prenons l’exemple suivant pour convertir plusieurs variables de package :

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

Le SSMA le convertit en code Transact-SQL suivant :

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

Émulation des méthodes Get et Set pour les variables de package

Oracle utilise les méthodes Get et Set pour les variables de package, afin d’éviter que d’autres sous-programmes ne puissent les lire et les écrire directement. S’il est nécessaire de conserver certaines variables disponibles entre les appels de sous-programme dans la même session, ces variables sont traitées comme des variables globales.

Pour surmonter cette règle d’étendue, SSMA pour Oracle utilise des procédures stockées comme ssma_oracle.set_pv_varchar pour chaque type de variable. Pour accéder à ces variables, SSMA utilise un ensemble de procédures et de fonctions indépendantes des transactions get_*set_*.

Type de données dans Oracle Procédure SSMA Set
VARCHAR ssma_oracle.set_pv_varchar
DATE (jj/mm/aaaa) ssma_oracle.set_pv_datetime2
CHAR ssma_oracle.set_pv_varchar
INT ssma_oracle.set_pv_float
FLOAT ssma_oracle.set_pv_float

Pour distinguer les variables de différentes sessions, SSMA stocke les variables avec leur SPID (identificateur de session) et l’heure de connexion de la session. Ainsi, les procédures get_* et set_* maintiennent les variables indépendantes des sessions qui les exécutent.