1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[OCI]OCI FunctionsのファンクションをAutonomous DatabaseからSQLファンクションとして呼び出してみた

Last updated at Posted at 2023-10-06

はじめに

先日の機能追加で、OCI FunctionsのファンクションをAutonomous DatabaseからSQLファンクションとして呼び出すことができるようになりました。

OCI FunctionsのファンクションをSQLファンクションとして呼び出すには、DBMS_CLOUD_FUNCTIONパッケージを使用して設定を行います。

今回は、OCI Functionsに事前定義済ファンクションとして用意されている「Object Storage File Zip」を「object_storage_file_zip」という名前のファンクションとしてデプロイし、「object_storage_file_zip」ファンクションをAutonomous DatabaseからSQLファンクションとして呼び出してみました。

AWS LambdaのファンクションをAutonomous DatabaseからSQLファンクションとして呼び出す場合の記事はこちら。

なお、今回はadminユーザとしてAutonomous Databaseに接続して検証を行いました。

1.クレデンシャルの作成

DBMS_CLOUD.CREATE_CREDENTIALプロシージャで、DBMS_CLOUD_FUNCTIONパッケージで使用するクレデンシャルを作成します。
今回はテナント管理者のAPIキーを使用してクレデンシャルを作成しました。

SQL> BEGIN
  2      DBMS_CLOUD.CREATE_CREDENTIAL (
  3         credential_name => 'OCI_CRED',
  4         user_ocid       => 'ocid1.user.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  5         tenancy_ocid    => 'ocid1.tenancy.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,
  6         private_key     => '-----BEGIN PRIVATE KEY-----
        <略>
 33  -----END PRIVATE KEY-----',
 34         fingerprint     => 'xx:xx:xx:xx:xx:xx:xx:xx:xx:xxxx:xx:xx:xx:xx:xx');
 35  END;
 36* /

PL/SQLプロシージャが正常に完了しました。

SQL> 

2. ファンクションのカタログの作成

DBMS_CLOUD_FUNCTION.CREATE_CATALOGプロシージャを使用して、ファンクションのカタログを作成します。
ここでは、クレデンシャルとして1.で作成したOCI_CREDを使用して、cloud_paramsで指定したリージョンおよびコンパートメント内にあるOCI Functinsのファンクションを含むカタログOCI_DEMO_CATALOGを作成しています。

SQL> BEGIN
  2      DBMS_CLOUD_FUNCTION.CREATE_CATALOG (
  3          credential_name  => 'OCI_CRED', 
  4          catalog_name     => 'OCI_DEMO_CATALOG', 
  5          service_provider => 'OCI',
  6          cloud_params     => '{"region_id":"ap-tokyo-1", "compartment_id":"ocid1.compartment.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}'
  7      );
  8  END;
  9* /

PL/SQLプロシージャが正常に完了しました。

SQL>

3. カタログの同期

DBMS_CLOUD_FUNCTION.SYNC_FUNCTIONSプロシージャを使用して、カタログOCI_DEMO_CATALOGのスコープ内にあるOCI Functionsのファンクションに対するPL/SQLラッパーを作成します。

SQL> BEGIN
  2   DBMS_CLOUD_FUNCTION.SYNC_FUNCTIONS (
  3          catalog_name => 'OCI_DEMO_CATALOG'
  4   );
  5  END;
  6* /

PL/SQLプロシージャが正常に完了しました。

SQL> 

4. カタログの内容の確認

DBMS_CLOUD_FUNCTION.LIST_FUNCTIONSプロシージャを使用して、カタログOCI_DEMO_CATALOGの内容を確認します。

SQL> VAR function_list CLOB;
SQL> 
SQL> BEGIN
  2      DBMS_CLOUD_FUNCTION.LIST_FUNCTIONS (
  3         credential_name  => 'OCI_CRED', 
  4         catalog_name     => 'OCI_DEMO_CATALOG',
  5         function_list    => :function_list);
  6  END;
  7* /

PL/SQLプロシージャが正常に完了しました。

SQL> 
SQL> SELECT JSON_QUERY(:function_list, '$' RETURNING VARCHAR2(32676) pretty) AS search_results FROM dual;

SEARCH_RESULTS                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
_________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ 
[
  {
    "functionName" : "object_storage_file_zip",
    "functionId" : "ocid1.fnfunc.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "invokeEndpoint" : "https://xxxxxxxxxxx.ap-tokyo-1.functions.oci.oraclecloud.com"
  }
]    

SQL> 

ファンクションobject_storage_file_zipがカタログOCI_DEMO_CATALOGに登録されていることが確認できました。

describeコマンドでファンクションobject_storage_file_zipの情報を確認してみます。

SQL> desc object_storage_file_zip

FUNCTION object_storage_file_zip RETURNS CLOB

引数名     タイプ   In/Out    デフォルトかどうか    
_________ _______ _________ ____________ 
PARAMS    CLOB    IN        unknown      
SQL>

5. Autonomous DatabaseからOCI Functionsのファンクションを実行

ファンクションobject_storage_file_zipは、指定したオブジェクト・ストレージ・バケット内のオブジェクトをZIPで固めて、指定したバケットに保存するという動作を行います。

ここでは東京リージョンにあるバケットSourceBucket内にあるファイルをZIPで圧縮して、バケットTargetBucket内に保存してみます。

まず、バケットSourceBucketの内容を確認します。

SQL> SELECT object_name, created
  2  FROM
  3  DBMS_CLOUD.LIST_OBJECTS(
  4    'OCI_CRED', 
  5    'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/namespace/b/SourceBucket/o'
  6* );

OBJECT_NAME      CREATED                                
________________ ______________________________________ 
testdata1.txt    02-NOV-22 02.47.12.833000000 AM GMT    
testdata2.txt    02-NOV-22 02.47.13.203000000 AM GMT    
testdata3.txt    02-NOV-22 02.47.13.411000000 AM GMT    
testdata4.txt    02-NOV-22 02.47.13.626000000 AM GMT    
testdata5.txt    02-NOV-22 02.47.13.906000000 AM GMT    

SQL> 

バケットSourceBucketには5つのファイルが格納されています。

バケットTargetBucketの内容を確認します。

SQL> SELECT object_name, created
  2  FROM
  3  DBMS_CLOUD.LIST_OBJECTS(
  4    'OCI_CRED', 
  5    'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/namespace/b/TargetBucket/o'
  6* );

行が選択されていません
SQL> 

バケットTargetBucketにはファイルが格納されていません。

以下のSQLでOCI Functionsのファンクションobject_storage_file_zipを実行します。
指定するパラメータの詳細はこちらに記載があります。

SQL> SELECT object_storage_file_zip(
  2    '{
  3        "COMPARTMENT_ID": "compartment_id":"ocid1.compartment.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  4        "REGION": "ap-tokyo-1",
  5        "SOURCE_BUCKET": "SourceBucket",
  6        "SOURCE_FILES": "/",
  7        "TARGET_BUCKET": "TargetBucket/ZippedByFunction.zip",
  8        "ALLOW_OVERWRITE": "true"
  9    }' 
 10  ) as response
 11* FROM dual;

RESPONSE                                                                                                                                                                                                                                                                                                                         
________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ 
{"STATUS":200,"RESPONSE_BODY":"{\"startTime\":\"2023-10-06T04:53:02.523303052Z\",\"endTime\":\"2023-10-06T04:53:18.242651321Z\",\"runTime\":\"PT15.719303349S\",\"code\":200,\"status\":\"Success\",\"data\":{\"additionalInformation\":{\"Message\":\"Zip File: ZippedByFunction.zip uploaded to Bucket: TargetBucket\"}}}"}    

SQL> 

ファンクションobject_storage_file_zipの実行が完了したら、バケットTargetBucketの内容を確認します。

SQL> SELECT object_name, created
  2  FROM
  3  DBMS_CLOUD.LIST_OBJECTS(
  4    'OCI_CRED', 
  5    'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/namespace/b/TargetBucket/o'
  6* );

OBJECT_NAME             CREATED                                
_______________________ ______________________________________ 
ZippedByFunction.zip    06-OCT-23 04.14.44.228000000 AM GMT    

SQL> 

バケットTargetBucket内に、OCI Functionsのファンクションobject_storage_file_zipによって作成されたZIPファイルZippedByFunction.zipが作成されていることが確認できました。

以上で、OCI FunctionsのファンクションをAutonomous DatabaseからSQLファンクションとして呼び出せることが確認できました。

参考情報

Invoke User Defined Functions
DBMS_CLOUD_FUNCTION Package
Object Storage File Zipファンクション

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?