Compartilhar via


Emular variáveis do pacote Oracle

O Oracle oferece suporte ao encapsulamento em um pacote de variáveis, tipos, procedimentos armazenados e funções. Ao converter os pacotes Oracle, você precisa converter:

  • Procedimentos e funções - públicas e privadas
  • Variáveis
  • Cursores
  • Rotinas de inicialização

Este artigo descreve como o Assistente de Migração do SQL Server (SSMA) para Oracle emula variáveis de pacote Oracle no SQL Server.

Noções básicas de conversão

Para armazenar variáveis de pacote, o SSMA para Oracle usa os procedimentos armazenados que residem em um esquema especial ssma_oracle junto com a tabela ssma_oracle.db_storage. Essa tabela é filtrada por SPID (identificador de sessão) e tempo de logon. A filtragem permite distinguir entre variáveis de sessões diferentes.

No início de cada procedimento de pacote convertido, o SSMA faz uma chamada para o procedimento especial ssma_oracle.db_check_init_package, que verifica se o pacote foi inicializado e o inicializa, se necessário. Cada procedimento de inicialização limpa a tabela de armazenamento e define os valores padrão para cada variável de pacote.

Exemplo

Considere o seguinte exemplo para converter várias variáveis de pacote:

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

O SSMA as converte no seguinte código Transact-SQL:

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

Emulando métodos de obtenção e configuração de variáveis de pacote

O Oracle usa os métodos Get e Set para as variáveis de pacote, para evitar que outros subprogramas as leiam e gravem diretamente. Se houver um requisito para manter algumas variáveis disponíveis entre as chamadas de subprograma na mesma sessão, essas variáveis serão tratadas como variáveis globais.

Para superar essa regra de escopo, o SSMA para Oracle usa os procedimentos armazenados como ssma_oracle.set_pv_varchar para cada tipo de variável. Para acessar essas variáveis, o SSMA usa um conjunto de procedimentos e funções get_* e set_* que independem de transações.

Tipo de dados no Oracle Procedimento SSMA Set
VARCHAR ssma_oracle.set_pv_varchar
DATE ssma_oracle.set_pv_datetime2
CHAR ssma_oracle.set_pv_varchar
INT ssma_oracle.set_pv_float
FLOAT ssma_oracle.set_pv_float

Para distinguir entre as variáveis de sessões diferentes, o SSMA armazena as variáveis juntamente com seu SPID (identificador de sessão) e o tempo de logon da sessão. Assim, os procedimentos get_* e set_* mantêm as variáveis independentes das sessões que as executam.