OCI Cloud FunctionsをSQL関数として起動するステップ
OCIリモート関数をデータベース内のSQL関数として起動するステップを示します。
OCIでクラウド関数をSQL関数として呼び出すために、APIエンドポイントを介してそれぞれのクラウド関数を参照および呼び出すSQLラッパー関数のカタログを作成します。このカタログを作成する前に、このカタログで参照するために必要なクラウド機能を作成したものとします。
Oracle Cloud Infrastructure Functionsおよびアプリケーション(OCIファンクションのグループ)の作成およびデプロイメントの詳細は、ファンクションの作成およびデプロイを参照してください。
-
プロシージャ
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関数アクセスに必要なポリシーを構成する必要があります。詳細は、ファンクション詳細を参照してください。 -
カタログを作成します。
カタログは、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ビュー・ビューを問い合せて、データベース内のすべてのカタログのリストを取得できます。
-
カタログ内の関数をリストできます。
次に、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プロシージャを参照してください。
-
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プロシージャを参照してください。
- SYNC_FUNCTIONS:
-
ファンクションの作成後、
DESCRIBEを実行して起動できます。DESC fintech_fun COLUMN STATUS format a30 COLUMN OUTPUT format a30DECLARE 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クラウド・ファンクションが呼び出されます。 -
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プロシージャを参照してください。
-
既存のカタログは、
DROP_CATALOGプロシージャを使用して削除できます。次に例を示します。BEGIN DBMS_CLOUD_FUNCTION.DROP_CATALOG ( catalog_name => 'OCI_DEMO_CATALOG' ); END; / **PL/SQL procedure successfully completed.**これにより、データベースから
OCI_DEMO_CATALOGが削除されます。詳細は、DROP_CATALOGプロシージャを参照してください。