Chamar procedures externos como funções SQL

Mostra as etapas para chamar procedimentos externos usando PL/SQL no seu banco de dados.

Visão Geral de Procedimentos Externos

procedures externos são funções gravadas em uma linguagem de terceira geração e que podem ser chamadas de dentro de PL/SQL ou SQL como se fossem uma rotina ou função PL/SQL.

Os procedimentos externos promovem a reutilização, a eficiência e a modularidade. Bibliotecas de links dinâmicos (DLLs) existentes gravadas em outras linguagens podem ser chamadas de programas PL/SQL. As DLLs são carregadas somente quando necessário e podem ser aprimoradas sem afetar os programas de chamada.

O uso de procedimentos externos também melhora o desempenho, pois as linguagens de terceira geração executam determinadas tarefas com mais eficiência do que o PL/SQL, que é mais adequado para o processamento de transações SQL.

Os procedimentos externos são úteis quando:

  • Resolver problemas científicos e de engenharia

  • Analisando dados

  • Controle de dispositivos e processos em tempo real

Consulte O Que É um Procedimento Externo? para obter mais informações.

Sobre o Uso de Procedimentos Externos no Autonomous Database

Você pode chamar e usar procedimentos externos no seu Autonomous Database com funções definidas pelo usuário.

Você não instala procedimentos externos em uma instância do Autonomous Database. Para usar um procedimento externo, o procedimento é hospedado remotamente em uma VM em execução em uma VCN (Rede Virtual na Nuvem) do Oracle Cloud Infrastructure.

Só há suporte para procedimentos externos quando o Autonomous Database está em um ponto final privado. A instância do agente EXTPROC é hospedada em uma sub-rede privada e o Autonomous Database acessa o agente EXTPROC por meio de um RCE ( Reverse Connection Endpoint).

Observação

O Autonomous Database só suporta procedimentos externos em linguagem C.

Os procedimentos externos são implantados usando:

  • Uma imagem de contêiner fornecida pela Oracle com o agente EXTPROC instalado e configurado como parte da pilha do Marketplace do Oracle Cloud Infrastructure (OCI).

    A instância do agente EXTPROC é hospedada remotamente em uma VM em execução em uma VCN (Rede Virtual na Nuvem) do Oracle Cloud Infrastructure. A comunicação segura entre o seu Autonomous Database e a instância do agente EXTPROC é garantida definindo regras de Grupo de Segurança de Rede (NSG) de modo que o tráfego seja permitido da sua instância do Autonomous Database em execução em um ponto final privado para a instância do agente EXTPROC.

    A imagem do agente EXTPROC é pré-configurada para hospedar e executar procedimentos externos na porta 16000.

  • Procedimentos PL/SQL para criar uma biblioteca e registrar e chamar funções e procedimentos externos.

    Consulte DBMS_CLOUD_FUNCTION Package para obter mais informações.

Siga estas etapas para chamar um procedimento externo no Autonomous Database:

Definir o procedimento C

Defina o procedimento C usando um desses protótipos.

  • Protótipos do estilo Kernighan & Ritchie. Por exemplo:

    void UpdateSalary(x)
     float x;
    ...
    
  • Protótipos ISO/ANSI que não sejam tipos de dados numéricos menores que a largura total (como float, short, char). Por exemplo:

    void UpdateSalary(double x)
    ...
    
  • Outros tipos de dados que não mudam de tamanho sob promoções de argumento padrão.

    Este exemplo altera o tamanho em promoções de argumento padrão:

    void UpdateSalary(float x)
    ...

Criar um Arquivo de Biblioteca Compartilhada (.so)

Crie uma biblioteca de objetos compartilhados (arquivo .so). A biblioteca de objetos compartilhados contém o procedimento C (procedimento externo) que foi definido na etapa anterior.

Você gera uma biblioteca de objetos compartilhada usando o seguinte comando:

gcc -I/u01/app/oracle/extproc_libs/ -shared -fPIC -o extproc.so UpdateSalary.c

Isso cria o objeto compartilhado (.so), biblioteca extproc.so. O procedimento UpdateSalary, definido na etapa anterior, está contido na biblioteca extproc.so. As bibliotecas de objeto compartilhado (.so) são carregadas dinamicamente no runtime.

Obtenha o Aplicativo OCI Marketplace EXTPROC Stack

Mostra as etapas para obter o Aplicativo de Pilha EXTPROC do OCI Marketplace.

Faça o seguinte:
  1. Acesse a Console do OCI em http://cloud.oracle.com. Consulte Acessar a Console do Oracle Cloud Infrastructure para obter mais informações.
  2. No menu de navegação esquerdo do Oracle Cloud Infrastructure, clique em Marketplace e, em Marketplace, clique em Todos os Aplicativos. Isso o levará ao painel Todos os Aplicativos do Marketplace.
  3. Informe EXTPROC no campo de pesquisa e clique em pesquisar.
  4. Clique no widget EXTPROC de Tipo: Pilha.
Isso leva você à página de detalhes do Oracle Autonomous Database EXTPROC Agent.

Iniciar Aplicativo de Pilha EXTPROC

Inicie o Aplicativo de Pilha EXTPROC na página Detalhes do Aplicativo EXTPROC.

  1. Na página Agente EXTPROC do Oracle Autonomous Database, em Pilha de Tipos, execute o seguinte:
    • Na lista drop-down Versão, selecione a versão do pacote da pilha. Por padrão, o menu exibe a versão mais recente.

    • Na lista drop-down Compartimento, selecione o nome do compartimento no qual deseja iniciar a instância.

      Observação

      Se você não tiver permissão para iniciar a instância no compartimento selecionado, a instância será iniciada no compartimento raiz.
    • Marque a caixa de seleção Revi e aceito os Termos e Restrições Padrão da Oracle.

  2. Clique em Ativar Pilha.

Isso leva você à página Criar pilha que permite criar pilha para o agente EXTPROC.

Criar Pilha para Aplicativo do Agente EXTPROC

Mostra as etapas para criar a Pilha para a instância EXTPROC.

No assistente de Criação de pilha, execute as seguintes etapas:
  1. Na página Informações da pilha, revise e edite as informações a seguir conforme necessário:
    • Informações da pilha

    • Fornecedores personalizados

    • Nome (Opcional): Você pode editar o nome da pilha padrão. Evite digitar informações confidenciais.

    • Descrição (Opcional): Você pode editar a descrição da pilha padrão. Evite digitar informações confidenciais.

    • Criar no compartimento

    • Versão do Terraform

    • Tags: Forneça o seguinte para designar tags à pilha.

      • Namespace de tag: Para adicionar uma tag definida, selecione um namespace existente. Para adicionar uma tag free-from, deixe o valor em branco.

      • Chave de tag: Para adicionar uma tag definida, selecione uma chave de tag existente. Para adicionar uma tag de formato livre, digite o nome da chave desejada.

      • Valor da tag: Digite o valor da tag que você deseja.

      Adicionar tag: Clique para adicionar outra tag.

      Consulte Tags de Recurso para obter mais informações sobre tags.

  2. Clique em Próximo.
    Isso leva você à página Configurar variáveis, que permite configurar variáveis para os recursos de infraestrutura que a pilha cria quando você executa o job de aplicação para este plano de execução.
  3. Na página Configurar variáveis, especifique as informações nas áreas: Configurar o Agente EXTPROC, Configuração de Rede e Configuração do serviço Compute.
    1. Forneça informações na área Configurar o Agente EXTPROC.
      • Bibliotecas Externas: Forneça uma lista de bibliotecas, separadas por vírgula (,), que você deseja permitir que sejam chamadas do seu Autonomous Database. Por exemplo, extproc.so, extproc1.so.

        Depois de criar a pilha, copie as bibliotecas para o diretório /u01/app/oracle/extproc_libs na VM do agente EXTPROC.

      • Senha da Wallet: Forneça a senha da wallet.

        A wallet e um certificado autoassinado são gerados para autenticação TLS mútua entre o Autonomous Database e a VM do agente EXTPROC. A wallet é criada no diretório /u01/app/oracle/extproc_wallet.
        Observação

        Depois que a wallet for criada, a senha da wallet não poderá ser alterada.
    2. Forneça informações na área Configuração de Rede.
      • Compartimento: Na lista drop-down, escolha o compartimento no qual você deseja colocar a configuração.

      • Estratégia de Rede: Escolha uma das opções na lista drop-down, Criar Nova VCN e Sub-rede ou Usar VCN e Sub-rede Existentes.

        • Criar Nova VCN e Sub-rede: Escolha esta opção se um ponto final privado não estiver configurado para o seu Autonomous Database. Isso cria uma nova VCN com sub-rede pública e privada que são pré-configuradas com regras de segurança.

          Se você selecionar esta opção, a página também mostrará a lista suspensa Estratégia de Configuração:

          Escolha Usar Configuração Recomendada na lista drop-down Estratégia de Configuração.

        • Usar VCN e Sub-rede Existentes: Selecione essa opção para criar o agente EXTPROC usando uma VCN existente. Isso cria a instância do agente EXTPROC na sub-rede fornecida.

          Quando você selecionar essa opção, forneça as seguintes informações para a VCN e a Sub-rede existentes:

          • Em Rede Virtual na Nuvem:

            Na lista drop-down VCN Existente, escolha uma VCN existente. Se a VCN especificada não existir, uma nova VCN será criada.

          • Em Sub-rede EXTPROC:

            Na lista drop-down Sub-rede Existente, escolha uma sub-rede existente.

            Quando você optar por usar uma VCN e uma sub-rede existentes, adicione uma regra de entrada para a porta 16000 da instância do agente EXTPROC. Você também adiciona uma regra de saída na sub-rede pública.

            Consulte Configurando o Acesso à Rede com Pontos Finais Privados para obter mais informações.

      • Tipo de Acesso do Agente EXTPROC: Escolha uma das seguintes opções na lista suspensa.

        • Acesso seguro de bancos de dados de Ponto Final Privado ADB-S específicos na sua VCN: Escolha essa opção para permitir que apenas IPs de ponto final privado especificados dentro da sua VCN (Rede Virtual na Nuvem) se conectem ao seu agente EXTPROC.

          Quando essa opção é escolhida, você fornece uma lista de Endereços IP de ponto final privado permitidos na próxima etapa.

        • Acesso seguro de todos os bancos de dados de Ponto Final Privado do ADB-S na sua VCN: Escolha essa opção para permitir que qualquer ponto final privado dentro da sua VCN (Rede Virtual na Nuvem) se conecte ao seu agente EXTPROC.

      • Endereços IP de Ponto Final Privado

        Forneça uma lista de endereços IP de ponto final privado separados por vírgula (,) para a variável Endereços IP de Ponto Final Privado. Por exemplo, 10.0.0.0, 10.0.0.1.

        Observação

        Este campo só é mostrado quando você seleciona Acesso seguro de bancos de dados de Ponto Final Privado ADB-S específicos na sua VCN para o tipo de Acesso do Agente EXTPROC.
    3. Forneça as informações de Configuração do serviço Compute.
      • Compartimento: Selecione o compartimento no qual deseja criar a pilha.

      • Forma: Selecione uma forma com base nos requisitos de carga de trabalho da instância do agente EXTPROC. A forma determina os recursos alocados para a instância do agente EXTPROC.

      • Número de OCPUs: Escolha o número de OCPUs que você deseja alocar para a instância do agente EXTPROC.

      • Tamanho da memória (GBs): Escolha o volume de memória em Gigabytes (GB) que você deseja alocar para a instância do agente EXTPROC.

      • Adicionar chaves SSH: Faça upload de uma chave pública SSH ou cole a chave pública. Selecione uma das seguintes opções:
        • Escolher arquivo de chave SSH: Faça upload da parte de chave pública do seu par de chaves. Navegue até o arquivo de chaves cujo upload você deseja fazer ou arraste e solte o arquivo na caixa.

        • Colar chave SSH: Cole na caixa a parte de chave pública de seu par de chaves.

  4. Clique em Próximo.

    Isso o levará à página Review.

  5. Na página Revisar, execute as seguintes etapas:
    1. Verifique as variáveis de configuração.
    2. Marque a caixa de seleção Executar aplicação em Executar aplicação na pilha criada?
    3. Clique em Criar.
    Observação

    Esta área não mostra variáveis que tenham valores padrão ou variáveis que você não tenha alterado.

    O Resource Manager executa o job de aplicação para criar recursos de pilha adequadamente. Isso leva você à página Detalhes do job e o estado do job é Aceito. Quando o job de aplicação inicia, o status é atualizado para Em Andamento.

    Observação

    As informações necessárias para estabelecer conexão com a instância criada como parte da pilha estão disponíveis na guia Informações do Aplicativo.

Fazer Upload da Wallet para Criar uma Conexão Segura com a Instância do Agente EXTPROC

Uma wallet autoassinada é criada como parte da criação do aplicativo do agente EXTPROC. Essa wallet permite que você acesse a instância do agente Extrpoc.

Para executar procedimentos remotos na instância do agente EXTPROC, o Autonomous Database e o agente EXTPROC se conectam usando o mTLS (Mutual Transport Layer Security). Ao usar o mTLS (Mutual Transport Layer Security), os clientes se conectam por meio de uma conexão do banco de Dados TCPS (Secure TCP) usando o TLS 1.2 padrão com um certificado da autoridade de certificado (CA) do cliente confiável. Consulte Sobre a Conexão com uma Instância do Autonomous Database para obter mais informações.
Observação

Você também pode obter e usar um certificado público emitido por uma Autoridade de Certificação (CA).

Como pré-requisito, exporte a wallet para o serviço Object Storage do diretório /u01/app/oracle/extproc_wallet na VM em que EXTPROC é executado.

Siga estas etapas para fazer upload da wallet para o seu Autonomous Database:

  1. Importe a wallet, cwallet.sso, que contém os certificados da instância do agente EXTPROC do serviço Object Storage no seu Autonomous Database. Observe o seguinte para o arquivo de wallet:
    • O arquivo da wallet, juntamente com o ID de usuário e a senha do Banco de Dados, fornecem acesso à instância do agente EXTPROC. Armazene os arquivos da wallet em um local seguro e compartilhe-os somente com usuários autorizados.

    • Não renomeie o arquivo de wallet. O arquivo da wallet no serviço Object Storage deve ter o nome cwallet.sso.

  2. Crie credenciais para acessar seu Armazenamento de Objetos no qual você armazena o arquivo de wallet cwallet.sso. Consulte CREATE_CREDENTIAL Procedimento para obter informações sobre os parâmetros de nome de usuário e senha para diferentes serviços de armazenamento de objetos.
    A criação de uma credencial para acessar o Oracle Cloud Infrastructure Object Store não será necessária se você ativar as credenciais do controlador de recursos. Consulte Sobre o Uso do Controlador de Recursos para Acessar Recursos do Oracle Cloud Infrastructure para obter mais informações.
  3. Crie um diretório no Autonomous Database para o arquivo de wallet cwallet.sso.
    CREATE DIRECTORY wallet_dir AS 'directory_location';

    Consulte Criar Diretório no Autonomous Database para obter mais informações sobre a criação de diretórios.

  4. Use DBMS_CLOUD.GET_OBJECT para fazer upload da wallet. Por exemplo:
    BEGIN
      DBMS_CLOUD.GET_OBJECT (
        credential_name     => 'DEF_CRED_NAME',
        object_uri          => 'https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname/o/cwallet.sso',
        directory_name      => 'WALLET_DIR'
    );
    END;
    /

    Neste exemplo, namespace-string corresponde ao namespace do Oracle Cloud Infrastructure Object Storage e bucketname corresponde ao nome do bucket. Consulte Namespaces do serviço Object Storage para obter mais informações.

    A wallet é copiada para o diretório criado na etapa anterior, WALLET_DIR. A wallet que permite estabelecer conexão com a instância do agente EXTPROC agora está disponível na sua instância do Autonomous Database.

Etapas para Chamar um Procedimento Externo como uma Função SQL

Mostra as etapas para chamar um Procedimento externo como uma função SQL.

Depois de iniciar o aplicativo de pilha EXTPROC do OCI Marketplace e configurá-lo para executar procedimentos externos, você cria uma biblioteca de funções wrapper SQL que fazem referência e chamam seus respectivos procedimentos externos.

Como pré-requisito, as bibliotecas na lista branca devem ser copiadas para o diretório /u01/app/oracle/extproc_libs na VM EXTPROC.

Siga estas etapas para criar uma biblioteca no seu Autonomous Database e registrar rotinas C como um procedimento externo na biblioteca:
  1. Crie uma biblioteca.

    Um procedimento externo é uma rotina de linguagem C armazenada em uma biblioteca. Para chamar procedimentos externos com o Autonomous Database, crie uma biblioteca.

    Execute DBMS_CLOUD_FUNCTION.CREATE_CATALOG para criar uma biblioteca. Por exemplo:

    BEGIN
        DBMS_CLOUD_FUNCTION.CREATE_CATALOG (
            library_name               => 'demolib',
            library_listener_url       => 'remote_extproc_hostname:16000',
            library_wallet_dir_name    => 'wallet_dir',
            library_ssl_server_cert_dn => 'CN=VM Hostname',
            library_remote_path        => '/u01/app/oracle/extproc_libs/library name'
    );
    END;
    /
    

    Isso cria a biblioteca demolib no seu Autonomous Database e registra a biblioteca de links dinâmicos no seu banco de dados. A instância do agente EXTPROC é pré-configurada para hospedar procedimentos externos na porta 16000.

    Consulte CREATE_CATALOG Procedimento para obter mais informações.

    Consulte as views DBA_CLOUD_FUNCTION_CATALOG View e USER_CLOUD_FUNCTION_CATALOG View para recuperar a lista de todos os catálogos e bibliotecas em seu banco de dados.

    Consulte a view USER_CLOUD_FUNCTION_ERRORS View para listar os erros gerados durante a validação da conexão com o local da biblioteca remota.

  2. Criar a função.

    Por exemplo:

    CREATE OR REPLACE FUNCTION ftest(
          x VARCHAR2, 
          y VARCHAR2) 
    RETURN VARCHAR2 AS LANGUAGE C
          LIBRARY test
          NAME "demolib"
          PARAMETERS(
              x STRING, 
              y STRING)
          AGENT IN (x);
    /
  3. Você pode eliminar uma biblioteca existente usando o procedimento DROP_CATALOG. Por exemplo:
    BEGIN
        DBMS_CLOUD_FUNCTION.DROP_CATALOG (
          LIBRARY_NAME  => 'demolib'
      );
    END;
    /
    

    Isso elimina a biblioteca DEMOLIB.

    Consulte DROP_CATALOG Procedimento para obter mais informações.