はじめに
オブジェクト・ストレージ・バケットに格納されている画像ファイルを一括でAutonomous DatabaseにBLOBとして取り込む方法を検証しました。
なお、今回検証した手順では OCIのリソース・プリンシパルを使用していますので、こちらのドキュメントを参考にして、あらかじめユーザーに対して、Autonomous Databaseインスタンスのリソース・プリンシパルを有効にしておく必要があります。
1.オブジェクト・ストレージへのJPEGファイルのアップロード
imagesという名前のバケットを作成し、5つのJPEGファイルをアップロードしました。
今回は私が所有しているレコードのジャケットの写真を使用しました。
2.テーブルの準備
JPEGファイル格納用のテーブル「image_blob_table」を作成します。
imgblob列がBLOB型となっており、こちらにJPEGファイルを格納します。
CREATE TABLE image_blob_table (
id NUMBER,
filename VARCHAR2(256),
imgblob BLOB
);
3.単一のJPEGファイルを取り込むPL/SQLプロシージャの作成
PL/SQL SDKのDBMS_CLOUD_OCI_OBS_OBJECT_STORAGE.GET_OBJECTファンクションを使用して、オブジェクト・ストレージ・バケットから1つのJPEGファイルを取得し、image_blob_tableテーブルのimgblob列に挿入するPL/SQLプロシージャ「load_image_to_blob」を作成します。
実行時には引数として、
・オブジェクト・ストレージのネームスペース
・オブジェクト・ストレージのバケット名
・オブジェクト・ストレージ・バケット内にあるJPEGファイルのファイル名
・リージョン識別子(ap-tokyo-1、ap-osaka-1など)
を渡します。
CREATE OR REPLACE PROCEDURE load_image_to_blob (
namespace IN VARCHAR2,
bucket_name IN VARCHAR2,
object_name IN VARCHAR2,
region_id IN VARCHAR2
)
IS
get_object_response DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_GET_OBJECT_RESPONSE_T;
BEGIN
DBMS_OUTPUT.PUT_LINE('https://objectstorage.'||region_id||'.oraclecloud.com/n/'||namespace||'/b/'||bucket_name||'/o/'||object_name);
get_object_response :=
DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE.GET_OBJECT(
namespace_name => namespace,
bucket_name => bucket_name,
object_name => object_name,
region => region_id,
credential_name => 'OCI$RESOURCE_PRINCIPAL'
);
INSERT INTO image_blob_table VALUES (
1,
object_name,
get_object_response.response_body
);
COMMIT;
END;
/
EXECコマンドでload_image_to_blobプロシージャを実行します。
EXEC load_image_to_blob('ネームスペース','images','Spinning_Toe-Hold.jpg','ap-tokyo-1')
Database Actionsで、image_blob_tableテーブルの内容を検索してみます。
SELECT * FROM image_blob_table;
1件のレコードが挿入されています。
imgblob列の(BLOB)の部分を選択し、鉛筆マークをクリックします。
「イメージ」タブを選択します。
JPEGファイルがimgblob列に格納されていることが確認できました。
4.バケット内のJPEGファイルを一括で取り込むPL/SQLプロシージャの作成
PL/SQL SDKのDBMS_CLOUD_OCI_OBS_OBJECT_STORAGE.LIST_OBJECTSファンクションとDBMS_CLOUD_OCI_OBS_OBJECT_STORAGE.GET_OBJECTファンクションを使用して、オブジェクト・ストレージ・バケット内のファイル一覧を取得し、全てのファイルをimage_blob_tableテーブルのimgblob列に挿入するPL/SQLプロシージャ「load_images_to_blob」を作成します。
実行時には引数として、
・オブジェクト・ストレージのネームスペース
・オブジェクト・ストレージのバケット名
・リージョン識別子(ap-tokyo-1、ap-osaka-1など)
を渡します。
CREATE OR REPLACE PROCEDURE load_images_to_blob (
namespace IN VARCHAR2,
bucket_name IN VARCHAR2,
region_id IN VARCHAR2
)
IS
list_object_response DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_LIST_OBJECTS_RESPONSE_T;
get_object_response DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_GET_OBJECT_RESPONSE_T;
object_name VARCHAR2(256);
BEGIN
list_object_response :=
DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE.LIST_OBJECTS(
namespace_name => namespace,
bucket_name => bucket_name,
region => region_id,
credential_name => 'OCI$RESOURCE_PRINCIPAL'
);
DBMS_OUTPUT.PUT_LINE('status code: ' || list_object_response.status_code);
DBMS_OUTPUT.PUT_LINE('object count: ' || list_object_response.response_body.objects.count);
for i in 1..list_object_response.response_body.objects.count
loop
object_name := list_object_response.response_body.objects(i).name;
DBMS_OUTPUT.PUT_LINE('https://objectstorage.'||region_id||'.oraclecloud.com/n/'||namespace||'/b/'||bucket_name||'/o/'||object_name);
get_object_response :=
DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE.GET_OBJECT(
namespace_name => namespace,
bucket_name => bucket_name,
object_name => object_name,
region => region_id,
credential_name => 'OCI$RESOURCE_PRINCIPAL'
);
INSERT INTO image_blob_table VALUES (
i,
object_name,
get_object_response.response_body
);
end loop;
COMMIT;
END;
/
プロシージャの実行前にimage_blob_tableテーブルを空にします。
TRUNCATE TABLE image_blob_table;
EXECコマンドでload_images_to_blobプロシージャを実行します。
EXEC load_images_to_blob('ネームスペース','images','ap-tokyo-1')
Database Actionsで、image_blob_tableテーブルの内容を検索してみます。
SELECT * FROM image_blob_table;
バケット内のファイル数と同じ、5件のレコードが挿入されています。
imgblob列の(BLOB)の部分を選択し、鉛筆マークをクリックします。
「イメージ」タブを選択します。
JPEGファイルがimgblob列に格納されていることが確認できました。
他のレコードも同様に確認してみます。
他のレコードにもJPEGファイルが格納されていることが確認できました。