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

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

なお、今回検証した手順では OCIのリソース・プリンシパルを使用していますので、[こちら](https://docs.oracle.com/cd/E83857_01/paas/autonomous-database/adbsa/resource-principal-use.html)のドキュメントを参考にして、あらかじめユーザーに対して、Autonomous Databaseインスタンスのリソース・プリンシパルを有効にしておく必要があります。

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

imagesという名前のバケットを作成し、5つのJPEGファイルをアップロードしました。
今回は私が所有しているレコードのジャケットの写真を使用しました。
![スクリーンショット 2022-03-16 9.01.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/4539ea7c-2d04-5855-0943-0454dedd5c00.png)

![スクリーンショット 2022-03-16 9.02.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/dfc35594-b132-7f82-9c36-f5cf622ff6b7.png)


# 2.テーブルの準備

JPEGファイル格納用のテーブル「image_blob_table」を作成します。
imgblob列がBLOB型となっており、こちらにJPEGファイルを格納します。

```sql:
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など）
を渡します。

```sql:
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プロシージャを実行します。

```sql:
EXEC load_image_to_blob('ネームスペース','images','Spinning_Toe-Hold.jpg','ap-tokyo-1')
```

Database Actionsで、image_blob_tableテーブルの内容を検索してみます。

```sql:
SELECT * FROM image_blob_table;
```
1件のレコードが挿入されています。
![スクリーンショット 2022-03-16 9.08.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/f5afd121-cbe2-647c-408d-9c6360a7095c.png)
imgblob列の(BLOB)の部分を選択し、鉛筆マークをクリックします。
![スクリーンショット 2022-03-16 9.09.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/25aca4ee-be47-b0f9-6c8b-0ff016d215c4.png)
「イメージ」タブを選択します。
![スクリーンショット 2022-03-16 9.09.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/f4f656e3-c4b9-ff67-dc9b-48faf81cece0.png)
JPEGファイルがimgblob列に格納されていることが確認できました。
![スクリーンショット 2022-03-16 9.10.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/fc52e4c3-80f0-aacb-8e8c-181605fe9f32.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など）
を渡します。

```sql:
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テーブルを空にします。
```sql:
TRUNCATE TABLE image_blob_table;
```
EXECコマンドでload_images_to_blobプロシージャを実行します。

```sql:
EXEC load_images_to_blob('ネームスペース','images','ap-tokyo-1')
```
Database Actionsで、image_blob_tableテーブルの内容を検索してみます。

```sql:
SELECT * FROM image_blob_table;
```
バケット内のファイル数と同じ、5件のレコードが挿入されています。
![スクリーンショット 2022-03-16 9.29.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/1356f8fa-48c5-7782-00f2-1a56f0ed2f24.png)
imgblob列の(BLOB)の部分を選択し、鉛筆マークをクリックします。
![スクリーンショット 2022-03-16 9.30.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/d9210e02-7a36-9e68-c17b-81104f68d733.png)
「イメージ」タブを選択します。
![スクリーンショット 2022-03-16 9.32.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/76d25c1b-973a-d8d6-2c82-a7a6f9de2cc0.png)
JPEGファイルがimgblob列に格納されていることが確認できました。
![スクリーンショット 2022-03-16 9.32.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/428c09b5-655f-779d-bc1d-2b405af09374.png)
他のレコードも同様に確認してみます。
![スクリーンショット 2022-03-16 9.34.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/51685017-35b9-801d-ada5-e4192fc68d5c.png)
![スクリーンショット 2022-03-16 9.35.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/5eebe3f3-a9f4-8df7-513b-8f3bbed251f5.png)
![スクリーンショット 2022-03-16 9.36.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/64d12b95-7e1d-dfdf-939d-5645408792c2.png)
![スクリーンショット 2022-03-16 9.36.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/b98486e6-1af0-affc-c730-1d82015c3a3d.png)

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