2
0

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 3 years have passed since last update.

[OCI]オブジェクト・ストレージ内にある複数のJPEGファイルを一括でAutonomous DatabaseにBLOBとして取り込んでみた

Last updated at Posted at 2022-03-16

はじめに

オブジェクト・ストレージ・バケットに格納されている画像ファイルを一括でAutonomous DatabaseにBLOBとして取り込む方法を検証しました。

なお、今回検証した手順では OCIのリソース・プリンシパルを使用していますので、こちらのドキュメントを参考にして、あらかじめユーザーに対して、Autonomous Databaseインスタンスのリソース・プリンシパルを有効にしておく必要があります。

1.オブジェクト・ストレージへのJPEGファイルのアップロード

imagesという名前のバケットを作成し、5つのJPEGファイルをアップロードしました。
今回は私が所有しているレコードのジャケットの写真を使用しました。
スクリーンショット 2022-03-16 9.01.51.png

スクリーンショット 2022-03-16 9.02.25.png

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件のレコードが挿入されています。
スクリーンショット 2022-03-16 9.08.59.png
imgblob列の(BLOB)の部分を選択し、鉛筆マークをクリックします。
スクリーンショット 2022-03-16 9.09.16.png
「イメージ」タブを選択します。
スクリーンショット 2022-03-16 9.09.48.png
JPEGファイルがimgblob列に格納されていることが確認できました。
スクリーンショット 2022-03-16 9.10.32.png

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件のレコードが挿入されています。
スクリーンショット 2022-03-16 9.29.15.png
imgblob列の(BLOB)の部分を選択し、鉛筆マークをクリックします。
スクリーンショット 2022-03-16 9.30.54.png
「イメージ」タブを選択します。
スクリーンショット 2022-03-16 9.32.09.png
JPEGファイルがimgblob列に格納されていることが確認できました。
スクリーンショット 2022-03-16 9.32.49.png
他のレコードも同様に確認してみます。
スクリーンショット 2022-03-16 9.34.59.png
スクリーンショット 2022-03-16 9.35.54.png
スクリーンショット 2022-03-16 9.36.23.png
スクリーンショット 2022-03-16 9.36.57.png

他のレコードにもJPEGファイルが格納されていることが確認できました。

2
0
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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?