Étapes pour appeler le service des fonctions en nuage pour OCI en tant que fonctions SQL

Affiche les étapes permettant d'appeler des fonctions distantes OCI en tant que fonctions SQL dans votre base de données.

Pour appeler des fonctions en nuage dans OCI en tant que fonctions SQL, nous créerons un catalogue de fonctions d'encapsuleur SQL qui référencent et appellent leur fonction en nuage respective au moyen de leurs points d'extrémité d'API. Avant de créer ce catalogue, il est supposé que vous avez créé les fonctions en nuage nécessaires pour être référencées par ce catalogue.

Voir Création et déploiement de fonctions pour plus d'informations sur la création et le déploiement d'Oracle Cloud Infrastructure Functions et de l'application (c'est-à-dire un groupe OCI Functions).

  1. Créez des données d'identification à l'aide de la procédure DBMS_CLOUD.CREATE_CREDENTIAL. L'objet de données d'identification que vous créez doit être de type clé privée.
    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.
    

    Cela crée les données d'identification OCI_CRED.

    Pour plus d'informations, voir ProcédureCREATE_CREDENTIAL.

    Note

    Si vous utilisez un principal de ressource pour l'authentification, les politiques nécessaires pour l'accès aux fonctions OCI doivent être configurées. Pour plus d'informations, voir Informations détaillées sur le service des fonctions.
  2. création d'un catalogue;

    Un catalogue est une collection de fonctions d'encapsuleur qui référencent et appellent leurs fonctions en nuage respectives au moyen de leurs points d'extrémité d'API.

    Exemple pour créer un catalogue pour 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.
    

    Cela crée le catalogue OCI_DEMO_CATALOG.

    Pour plus d'informations, voir ProcédureCREATE_CATALOG. Vous pouvez interroger les vues Vue DBA_CLOUD_FUNCTION_CATALOG et Vue USER_CLOUD_FUNCTION_CATALOG pour extraire la liste de tous les catalogues de votre base de données.

  3. Vous pouvez répertorier les fonctions dans un catalogue.

    Voici l'exemple pour lister 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"
      }
    ]

    Pour plus d'informations, voir ProcédureLIST_FUNCTIONS.

  4. Exécutez DBMS_CLOUD_FUNCTION.SYNC_FUNCTIONS pour créer des fonctions SQL d'encapsuleur. Vous pouvez utiliser l'une des méthodes suivantes pour créer les fonctions SQL du wrapper dans le catalogue, qui appellent leurs fonctions cloud respectives :
    • SYNC_FUNCTIONS : SYNC_FUNCTIONS est la méthode la plus rapide et la plus simple qui synchronise automatiquement (crée ou supprime) les fonctions d'encapsuleur dans le catalogue avec la liste complète des fonctions en nuage définies dans la région, le compartiment et la location avec lesquels le catalogue a été créé. Exemple :

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

    Cela crée un wrapper PL/SQL permettant d'ajouter de nouvelles fonctions au catalogue et de supprimer des wrappers pour les fonctions qui ont été supprimées du catalogue.

    Exécutez l'interrogation suivante pour vérifier la synchronisation.

    
    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
    
    Note

    Conservez une note de l'utilisateur courant pour exécuter cette commande.

    Pour plus d'informations, voir ProcédureSYNC_FUNCTIONS.

    • Vous pouvez créer manuellement une fonction SQL dans votre catalogue qui appelle sa fonction en nuage respective à l'aide de DBMS_CLOUD.CREATE_FUNCTION. Exemple :

    Exemple pour créer une fonction dans le catalogue 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.

    Cela crée la fonction FINTECH_FUN dans le catalogue OCI_DEMO_CATALOG.

    La fonction FINTECH_FUN dans le catalogue est une référence à la fonction en nuage respective dont le point d'extrémité est référencé par le paramètre FUNCTION_ID. L'appel de la fonction dans le catalogue avec ses arguments exécute la fonction cloud correspondante et fournit la sortie retournée par la fonction cloud.

    La création manuelle d'une fonction dans le catalogue vous permet également de créer des types de retour et des gestionnaires de réponses personnalisés. Exemple :

    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.
    

    Vous pouvez interroger les vues Vue DBA_CLOUD_FUNCTION et Vue USER_CLOUD_FUNCTION pour extraire la liste de toutes les fonctions de votre base de données.

    Pour plus d'informations, voir ProcédureCREATE_FUNCTION.

  5. Une fois la fonction créée, vous pouvez DESCRIBE et l'appeler.
    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.

    Cela appelle la fonction en nuage fintech_fun en appelant la référence de fonction oocid1.funfn.oci.phx.aaaaaa_example dans le catalogue OCI_DEMO_CATALOG.

  6. Vous pouvez supprimer une fonction existante à l'aide de la procédure DROP_FUNCTION. Exemple :
    EXEC DBMS_CLOUD_FUNCTION.DROP_FUNCTION (CATALOG_NAME => 'OCI_DEMO_CATALOG', FUNCTION_NAME => 'fintech_fun');
    
    PL/SQL procedure successfully completed.
    

    Cette action supprime la fonction FINTECH_FUN du catalogue OCI_DEMO_CATALOG.

    Pour plus d'informations, voir ProcédureDROP_FUNCTION.

  7. Vous pouvez supprimer un catalogue existant à l'aide de la procédure DROP_CATALOG. Exemple :
    BEGIN
        DBMS_CLOUD_FUNCTION.DROP_CATALOG (
          catalog_name     => 'OCI_DEMO_CATALOG'
      );
    END;
    /
    
    PL/SQL procedure successfully completed.

    Cette action supprime OCI_DEMO_CATALOG de la base de données.

    Pour plus d'informations, voir ProcédureDROP_CATALOG.