OCIクラウド関数をSQL関数として起動するステップ

データベースでSQL関数としてOCIリモート関数を呼び出すステップを示します。

OCIでクラウド関数をSQL関数として呼び出すには、APIエンドポイントを介してそれぞれのクラウド関数を参照およびコールするSQLラッパー関数のカタログを作成します。このカタログを作成する前に、このカタログで参照するために必要なクラウド機能が作成されていることを前提としています。

Oracle Cloud Infrastructure Functionsおよびアプリケーション(OCIファンクションのグループ)の作成およびデプロイメントの詳細は、ファンクションの作成およびデプロイを参照してください。

  1. プロシージャDBMS_CLOUD.CREATE_CREDENTIALを使用して資格証明を作成します。作成する資格証明オブジェクトは、秘密キーのタイプである必要があります。
    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.
    

    これにより、OCI_CRED資格証明が作成されます。

    詳細は、CREATE_CREDENTIALプロシージャを参照してください。

    ノート

    認証にリソース・プリンシパルを使用している場合は、OCIファンクション・アクセスに必要なポリシーを構成する必要があります。詳細は、ファンクションの詳細を参照してください。
  2. カタログを作成します。

    カタログとは、APIエンドポイントを介してそれぞれのクラウド関数を参照およびコールするラッパー関数の集合です。

    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.
    

    これにより、OCI_DEMO_CATALOGカタログが作成されます。

    詳細は、CREATE_CATALOGプロシージャを参照してください。DBA_CLOUD_FUNCTION_CATALOGビューおよびUSER_CLOUD_FUNCTION_CATALOGビュー・ビューを問い合せると、データベース内のすべてのカタログのリストを取得できます。

  3. カタログ内の関数をリストできます。

    次に、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"
      }
    ]

    詳細は、LIST_FUNCTIONSプロシージャを参照してください。

  4. DBMS_CLOUD_FUNCTION.SYNC_FUNCTIONSを実行して、ラッパーSQL関数を作成します。次のいずれかの方法を使用して、カタログにラッパーSQL関数を作成し、それぞれのクラウド関数をコールできます。
    • SYNC_FUNCTIONS: SYNC_FUNCTIONSは、カタログ内のラッパー関数を自動的に同期(作成または削除)し、カタログが作成されたリージョン、コンパートメントおよびテナンシで定義されているクラウド関数の完全なリストとともに同期(作成または削除)する、最も迅速で簡単な方法です。次に例を示します。

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

    これにより、カタログに新しいファンクションを追加し、カタログから削除されたファンクションのラッパーを削除するためのPL/SQLラッパーが作成されます。

    次の問合せを実行して、同期を確認します。

    
    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
    
    ノート

    このコマンドを実行するには、現在のユーザーをノートにとります。

    詳細は、SYNC_FUNCTIONSプロシージャを参照してください。

    • DBMS_CLOUD.CREATE_FUNCTIONを使用して、それぞれのクラウド関数をコールするSQLファンクションをカタログに手動で作成できます。次に例を示します。

    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.

    これにより、OCI_DEMO_CATALOGカタログにFINTECH_FUN関数が作成されます。

    カタログ内のFINTECH_FUN関数は、エンドポイントがFUNCTION_IDパラメータによって参照されるそれぞれのクラウド関数への参照です。カタログ内の関数を引数とともに呼び出すと、対応するクラウド関数が実行され、クラウド関数から返される出力が提供されます。

    カタログでファンクションを手動で作成すると、カスタム戻り型およびレスポンス・ハンドラを作成することもできます。次に例を示します。

    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.
    

    DBA_CLOUD_FUNCTIONビューおよびUSER_CLOUD_FUNCTIONビュー・ビューを問い合せると、データベース内のすべてのファンクションのリストを取得できます。

    詳細は、CREATE_FUNCTIONプロシージャを参照してください。

  5. ファンクションの作成後、DESCRIBEして起動できます。
    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.

    これにより、OCI_DEMO_CATALOGカタログの関数参照oocid1.funfn.oci.phx.aaaaaa_exampleをコールして、fintech_funクラウド関数が起動されます。

  6. DROP_FUNCTIONプロシージャを使用して、既存のファンクションを削除できます。例:
    EXEC DBMS_CLOUD_FUNCTION.DROP_FUNCTION (CATALOG_NAME => 'OCI_DEMO_CATALOG', FUNCTION_NAME => 'fintech_fun');
    
    PL/SQL procedure successfully completed.
    

    これにより、OCI_DEMO_CATALOGカタログからFINTECH_FUN関数が削除されます。

    詳細は、DROP_FUNCTIONプロシージャを参照してください。

  7. DROP_CATALOGプロシージャを使用して、既存のカタログを削除できます。例:
    BEGIN
        DBMS_CLOUD_FUNCTION.DROP_CATALOG (
          catalog_name     => 'OCI_DEMO_CATALOG'
      );
    END;
    /
    
    PL/SQL procedure successfully completed.

    これにより、データベースからOCI_DEMO_CATALOGが削除されます。

    詳細は、DROP_CATALOGプロシージャを参照してください。