Pasos para llamar a OCI Cloud Functions como funciones SQL

Muestra los pasos para llamar a funciones remotas de OCI como funciones SQL en la base de datos.

Para llamar a funciones en la nube en OCI como funciones SQL, crearemos un catálogo de funciones de envoltorio SQL que hagan referencia y llamen a sus respectivas funciones en la nube a través de sus puntos finales de API. Antes de crear este catálogo, se asume aquí que ha creado las funciones en la nube necesarias a las que se hará referencia en este catálogo.

Consulte Creación y despliegue de funciones para obtener más información sobre la creación y el despliegue de Oracle Cloud Infrastructure Functions y la aplicación (es decir, un grupo de OCI Functions).

  1. Cree credenciales mediante el procedimiento DBMS_CLOUD.CREATE_CREDENTIAL. El objeto de credencial que está creando debe ser de tipo clave 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.
    

    Esto crea la credencial OCI_CRED.

    Consulte Procedimiento CREATE_CREDENTIAL para obtener más información.

    Nota

    Si utiliza una entidad de recurso para la autenticación, se deben configurar las políticas necesarias para el acceso a la función de OCI. Consulte Detalles de Functions para obtener más información.
  2. Cree un catálogo.

    Un catálogo es una recopilación de funciones de envoltorio que hacen referencia y llaman a sus respectivas funciones en la nube a través de sus puntos finales de API.

    Ejemplo para crear un catálogo para 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.
    

    Esto crea el catálogo OCI_DEMO_CATALOG.

    Consulte el procedimiento CREATE_CATALOG para obtener más información. Puede consultar las vistas DBA_CLOUD_FUNCTION_CATALOG y USER_CLOUD_FUNCTION_CATALOG para recuperar la lista de todos los catálogos de la base de datos.

  3. Puede mostrar las funciones de un catálogo.

    A continuación, se muestra un ejemplo para mostrar 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 el procedimiento LIST_FUNCTIONS para obtener más información.

  4. Ejecute DBMS_CLOUD_FUNCTION.SYNC_FUNCTIONS para crear funciones SQL de envoltorio. Puede utilizar uno de los siguientes métodos para crear las funciones SQL del envoltorio en el catálogo, que llaman a sus respectivas funciones en la nube:
    • SYNC_FUNCTIONS: SYNC_FUNCTIONS es el método más rápido y sencillo, que sincroniza (crea o suprime) automáticamente las funciones de envoltorio del catálogo con la lista completa de funciones en la nube definidas en la región, el compartimento y el arrendamiento con los que se ha creado el catálogo. Por ejemplo:

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

    Esto crea un envoltorio PL/SQL para agregar nuevas funciones al catálogo y eliminar envoltorios para funciones que se han suprimido del catálogo.

    Ejecute la siguiente consulta para verificar la sincronización.

    
    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
    
    Nota

    Mantenga una nota del usuario actual para ejecutar este comando.

    Consulte el procedimiento SYNC_FUNCTIONS para obtener más información.

    • Puede crear manualmente una función SQL en el catálogo que llame a su función en la nube respectiva mediante DBMS_CLOUD.CREATE_FUNCTION. Por ejemplo:

    Ejemplo para crear una función en el 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.

    Esto crea la función FINTECH_FUN en el catálogo OCI_DEMO_CATALOG.

    La función FINTECH_FUN del catálogo es una referencia a la función en la nube correspondiente cuyo punto final hace referencia al parámetro FUNCTION_ID. La llamada a la función en el catálogo junto con sus argumentos ejecuta la función de nube correspondiente y proporciona la salida devuelta por la función de nube.

    La creación manual de una función en el catálogo también permite crear tipos de retorno personalizados y manejadores de respuestas. Por ejemplo:

    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_reponse_handler varchar2(1000);
    
    exec :input_param       := TO_CLOB('{"command": "VARCHAR2", "value": "VARCHAR2"}');
    exec :l_return_type     := 'fintech_rt';
    exec :l_reponse_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 ,REPONSE_HANDLER =>:l_reponse_handler);
    
    PL/SQL procedure successfully completed.
    

    Puede consultar las vistas DBA_CLOUD_FUNCTION y USER_CLOUD_FUNCTION para recuperar la lista de todas las funciones de la base de datos.

    Consulte el procedimiento CREATE_FUNCTION para obtener más información.

  5. Una vez creada la función, puede ejecutar DESCRIBE y llamarla.
    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.

    Esto llama a la función en la nube fintech_fun llamando a la referencia de función oocid1.funfn.oci.phx.aaaaaa_example en el catálogo OCI_DEMO_CATALOG.

  6. Puede borrar una función existente mediante el procedimiento DROP_FUNCTION. Por ejemplo:
    EXEC DBMS_CLOUD_FUNCTION.DROP_FUNCTION (CATALOG_NAME => 'OCI_DEMO_CATALOG', FUNCTION_NAME => 'fintech_fun');
    
    PL/SQL procedure successfully completed.
    

    Esto borra la función FINTECH_FUN del catálogo OCI_DEMO_CATALOG.

    Consulte el procedimiento DROP_FUNCTION para obtener más información.

  7. Puede borrar un catálogo existente mediante el procedimiento DROP_CATALOG. Por ejemplo:
    BEGIN
        DBMS_CLOUD_FUNCTION.DROP_CATALOG (
          catalog_name     => 'OCI_DEMO_CATALOG'
      );
    END;
    /
    
    PL/SQL procedure successfully completed.

    Esto borra OCI_DEMO_CATALOG de la base de datos.

    Consulte el procedimiento DROP_CATALOG para obtener más información.