Etapas para Chamar o OCI Cloud Functions como Funções SQL

Mostra as etapas para chamar funções remotas do OCI como funções SQL no seu banco de dados.

Para chamar funções de nuvem no OCI como funções SQL, criaremos um catálogo de funções de encapsulador SQL que fazem referência e chamam sua respectiva função de nuvem por meio de seus pontos finais de API. Antes de criar este catálogo, presume-se aqui que você criou as funções de nuvem necessárias para serem referenciadas por este catálogo.

Consulte Criando e Implantando Funções para obter mais informações sobre a criação e a implantação do Oracle Cloud Infrastructure Functions and Application (ou seja, um grupo de Funções do OCI).

  1. Crie credenciais usando o procedimento DBMS_CLOUD.CREATE_CREDENTIAL. O objeto de credencial que você está criando deve ser do tipo chave privada.
    SET DEFINE OFF
    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL (
           credential_name => 'OCI_CRED',
           user_ocid       => 'user_ocid',
           tenancy_ocid    => 'tenancy_ocid',
           private_key     => 'private_key',
           fingerprint     => 'fingerprint'
      );
    END;
    /
    
    PL/SQL procedure successfully completed.
    

    Isso cria a credencial OCI_CRED.

    Consulte CREATE_CREDENTIAL Procedimento para obter mais informações.

    Observação

    Se você estiver usando um Controlador de Recursos para autenticação, as políticas necessárias necessárias para o acesso ao OCI Function deverão ser configuradas. Consulte Detalhes do serviço Functions para obter mais informações.
  2. Criar um catálogo.

    Um catálogo é uma coleção de funções wrapper que fazem referência e chamam suas respectivas funções de nuvem por meio de seus pontos finais de API.

    Exemplo para criar um catálogo para o Oracle Cloud Infrastructure Functions.

    BEGIN
    DBMS_CLOUD_FUNCTION.CREATE_CATALOG (
        credential_name  => 'OCI_CRED',
        catalog_name     => 'OCI_DEMO_CATALOG',
        service_provider => 'OCI',
        cloud_params     => '{"region_id":"phx",
          "compartment_id":"compartment_id"}'
    );
    END;
    /
    
    PL/SQL procedure successfully completed.
    

    Isso cria o catálogo OCI_DEMO_CATALOG.

    Consulte CREATE_CATALOG Procedimento para obter mais informações. Você pode consultar as views DBA_CLOUD_FUNCTION_CATALOG View e USER_CLOUD_FUNCTION_CATALOG View para recuperar a lista de todos os catálogos do seu banco de dados.

  3. Você pode listar as funções em um catálogo.

    Veja a seguir o exemplo para listar o Oracle Cloud Infrastructure Functions:

    VAR function_list CLOB;
    
    BEGIN
        DBMS_CLOUD_FUNCTION.LIST_FUNCTIONS (
          credential_name  => 'OCI_CRED', 
          catalog_name     => 'OCI_DEMO_CATALOG',
          function_list    => :function_list
     );
    END;
    /
    
    PL/SQL procedure successfully completed.
    
    SELECT JSON_QUERY (:function_list, '$' RETURNING VARCHAR2(32676) pretty) AS search_results FROM dual;
    SEARCH_RESULTS                        --This is a sample output
    ------------------------------------------------------------------------------------------------
    [
      {
        "functionName"   : "create_par",
        "functionId"     : "ocid.funfc.oc1.phx.aaaa_example", 
        "invokeEndpoint" : "https://dw.us.func.oci.oraclecloud_example.com"
      },
      {
        "functionName"   : "fintech",
        "functionId"     : "ocid.funfc.oc1.phx.bbbb_example"
    SEARCH_RESULTS
    ------------------------------------------------------------------------------------------------
    4ayosyosv4sthmya2lyza",
        "invokeEndpoint" : "https://dw.us.func.oci.oraclecloud.com_example"
      },
      {
        "functionName"   : "jwt_codec",
        "functionId"     : "ocid.funfc.oc1.phx.jwt_code_example", 
        "invokeEndpoint" : "https://dw.us.func.oci.oraclecloud_example.com"
      },
    SEARCH_RESULTS
    ------------------------------------------------------------------------------------------------
      {
        "functionName"   : "oci-objectstorage-create-par-python",
        "functionId"     : "ocid.funfc.oc1.phx.aaaaaaaas_example", 
        "invokeEndpoint" : "https://dw.us.func.oci.oraclecloud_example.com"
      },
      {
        "functionName"   : "run_dbt",
        "functionId"     : "ocid.funfc.oc1.phx.aaaaaaaav_example",
    
    SEARCH_RESULTS
    ------------------------------------------------------------------------------------------------
        "invokeEndpoint" : "https://dw.us.func.oci.oraclecloud_example.com"
      }
    ]

    Consulte LIST_FUNCTIONS Procedimento para obter mais informações.

  4. Execute DBMS_CLOUD_FUNCTION.SYNC_FUNCTIONS para criar funções SQL wrapper. Você pode usar um dos seguintes métodos para criar as funções SQL wrapper no catálogo, que chamam suas respectivas funções de nuvem:
    • SYNC_FUNCTIONS: SYNC_FUNCTIONS é o método mais rápido e simples, que sincroniza automaticamente (cria ou exclui) funções wrapper no catálogo com a lista completa de funções de nuvem definidas na região, compartimento e tenancy com a qual o catálogo foi criado. Por exemplo:

    
    BEGIN
     DBMS_CLOUD_FUNCTION.SYNC_FUNCTIONS (
            catalog_name => 'OCI_DEMO_CATALOG'
     );
    END;
    /
    PL/SQL procedure successfully completed.
    

    Isso cria um wrapper PL/SQL para adicionar novas funções ao catálogo e remover wrappers para funções que foram excluídas do catálogo.

    Execute a seguinte consulta para verificar a sincronização.

    
    SELECT object_name FROM sys.all_objects WHERE owner='TEST_USER' AND object_type='FUNCTION';
    
    OBJECT_NAME
    --------------------------------------------------------------------------------
    CREATE_PAR
    FINTECH
    JWT_CODEC
    OCI-OBJECTSTORAGE-CREATE-PAR-PYTHON
    RUN_DBT
    
    Observação

    Anote o usuário atual para executar esse comando.

    Consulte SYNC_FUNCTIONS Procedimento para obter mais informações.

    • Você pode criar manualmente uma Função SQL em seu catálogo que chame sua respectiva função de nuvem usando DBMS_CLOUD.CREATE_FUNCTION. Por exemplo:

    Exemplo para criar uma função no catálogo OCI_DEMO_CATALOG.

    VAR function_args CLOB;
    EXEC :function_args := TO_CLOB('{"command": "VARCHAR2", "value": "VARCHAR2"}');
    BEGIN
        DBMS_CLOUD_FUNCTION.CREATE_FUNCTION (
            credential_name  => 'OCI_CRED',
            catalog_name     => 'OCI_DEMO_CATALOG',
            function_name    => 'fintech_fun',
            function_id      => 'ocid1.fnfunc.oc1.phx.aaabbbcccc_example',
            input_args       => :function_args
     );
    END;
    /
    
    PL/SQL procedure successfully completed.

    Isso cria a função FINTECH_FUN no catálogo OCI_DEMO_CATALOG.

    A função FINTECH_FUN no catálogo é uma referência à respectiva função de nuvem cujo ponto final é referenciado pelo parâmetro FUNCTION_ID. Chamar a função no catálogo junto com seus argumentos executa a função de nuvem correspondente e fornece a saída retornada pela função de nuvem.

    A criação manual de uma função no catálogo também permite criar tipos de retorno personalizados e handlers de resposta. Por exemplo:

    CREATE OR REPLACE TYPE fintech_rt AS OBJECT (
        STATUS  VARCHAR2(1000),  
        OUTPUT  CLOB
    );
    /
    
    Type created.
    CREATE OR REPLACE FUNCTION fintech_response_handler(function_response in CLOB) 
    RETURN fintech_rt
    IS
    l_comp   fintech_rt;
    l_json_obj  JSON_OBJECT_T;
    status  VARCHAR2(1000);
    output  CLOB;
    BEGIN
          l_json_obj := JSON_OBJECT_T.parse(function_response); 
          status     := l_json_obj.get('STATUS').to_string;
          output     := l_json_obj.get('RESPONSE_BODY').to_string;
          l_comp     := fintech_rt(status,output);
          RETURN l_comp;
    END;
    /
    Function created.
    
    VAR input_param clob;
    VAR  l_return_type varchar2(100);
    VAR  l_response_handler varchar2(1000);
    
    exec :input_param       := TO_CLOB('{"command": "VARCHAR2", "value": "VARCHAR2"}');
    exec :l_return_type     := 'fintech_rt';
    exec :l_response_handler := 'fintech_response_handler';
    
    PL/SQL procedure successfully completed.
    
    PL/SQL procedure successfully completed.
    
    PL/SQL procedure successfully completed.
    
    EXEC DBMS_CLOUD_FUNCTION.CREATE_FUNCTION (CREDENTIAL_NAME => 'OCI_CRED', FUNCTION_NAME => 'fintech_fun', CATALOG_NAME => 'OCI_DEMO_CATALOG', FUNCTION_ID => 'ocid1.funfn.oci.phx.aaaaaa_example', INPUT_ARGS => :input_param, RETURN_TYPE => :l_return_type ,RESPONSE_HANDLER =>:l_response_handler);
    
    PL/SQL procedure successfully completed.
    

    Você pode consultar as views DBA_CLOUD_FUNCTION View e USER_CLOUD_FUNCTION View para recuperar a lista de todas as funções do seu banco de dados.

    Consulte CREATE_FUNCTION Procedimento para obter mais informações.

  5. Depois que a função for criada, você poderá DESCRIBE e chamá-la.
    DESC fintech_fun
    COLUMN STATUS format a30
    COLUMN OUTPUT format a30
    DECLARE
    l_comp fintech_rt;
    BEGIN
    l_comp := fintech_fun(command=>'tokenize',value => 'PHI_INFORMATION');
    DBMS_OUTPUT.put_line ('Status of the function   =  '|| l_comp.status);
    DBMS_OUTPUT.put_line ('Response of the function =  '|| l_comp.output);
    END;
    /
    
    PL/SQL procedure successfully completed.

    Isso chama a função de nuvem fintech_fun chamando a referência de função oocid1.funfn.oci.phx.aaaaaa_example no catálogo OCI_DEMO_CATALOG.

  6. Você pode eliminar uma função existente usando o procedimento DROP_FUNCTION. Por exemplo:
    EXEC DBMS_CLOUD_FUNCTION.DROP_FUNCTION (CATALOG_NAME => 'OCI_DEMO_CATALOG', FUNCTION_NAME => 'fintech_fun');
    
    PL/SQL procedure successfully completed.
    

    Isso elimina a função FINTECH_FUN do catálogo OCI_DEMO_CATALOG.

    Consulte DROP_FUNCTION Procedimento para obter mais informações.

  7. Você pode eliminar um catálogo existente usando o procedimento DROP_CATALOG. Por exemplo:
    BEGIN
        DBMS_CLOUD_FUNCTION.DROP_CATALOG (
          catalog_name     => 'OCI_DEMO_CATALOG'
      );
    END;
    /
    
    PL/SQL procedure successfully completed.

    Isso elimina o OCI_DEMO_CATALOG do seu banco de dados.

    Consulte DROP_CATALOG Procedimento para obter mais informações.