[OCI]Autonomous Database:オブジェクト・ストレージ内にあるJPEGファイルをSELECT文の結果として表示してみた

# はじめに
[こちら](https://qiita.com/500InternalServerError/items/59c91f07731caef62e9a)の記事では、オブジェクト・ストレージ上のバケット内にある画像ファイルをAutunomous Database内の表にBLOBとして取り込む手順を検証しました。

今回は、画像ファイルをオブジェクト・ストレージにおいたままで、SELECT文の検索結果として画像ファイルを表示する手法を検証してみました。

こちらの手法ですと、画像ファイルをAutonomous Database内に取り込まないため、Autonomous Databaseのストレージの節約になります。

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

# 1.オブジェクト・ストレージ上の画像ファイルをBLOBとして取得するファンクションの作成
オブジェクト・ストレージ上の画像ファイルのファイル名を引数として渡すと、オブジェクトストレージ上の画像ファイルの内容をBLOBとして返すファンクションget_imageを作成します。

```sql:get_imageファンクション
CREATE FUNCTION get_image( object_name IN VARCHAR2)
	RETURN BLOB
IS
	get_object_response DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_GET_OBJECT_RESPONSE_T;
	namespace 	VARCHAR2(100) := 'ネームスペース';
	bucket_name VARCHAR2(100) := 'images';
	region_id 	VARCHAR2(100) := 'ap-tokyo-1';
BEGIN
	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'
		);
		
	RETURN get_object_response.response_body;
END;
/
```

# 2. ファンクションget_imageの動作確認

ファンクションget_imageの動作を確認します。
```sql:
SELECT get_image('CHAMP.jpg') FROM dual;
```
![スクリーンショット 2022-03-16 15.10.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/934acf9e-eaef-0bc6-3872-c67ddd8af713.png)

# 3.テーブルの作成
IDとファイル名を保持するテーブルimage_extを作成します。

```sql:
CREATE TABLE image_ext (
id NUMBER,
name VARCHAR2(100)
);
```
CHAMP.jpgを参照する行をimage_extにインサートします。

```sql:
INSERT INTO image_ext VALUES (1,'CHAMP.jpg');
```

image_extから、ID、ファイル名、ファイル名を引数にしたget_imageファンクションの結果を検索します。
```sql:
SELECT id, name, get_image(name) FROM  image_ext;
```
![スクリーンショット 2022-03-16 15.15.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/aba279b5-5b0e-da4e-053d-a95ea4898880.png)
鉛筆マークをクリックして、BLOBの内容を確認します。
![スクリーンショット 2022-03-16 15.16.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/d987c627-ba7e-6d43-54b1-1e58c0a26d04.png)
「イメージ」タブをクリックします。
![スクリーンショット 2022-03-16 15.17.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/a405e4c1-a9a8-1403-7774-c32d5ca54811.png)
オブジェクト・ストレージ上にあるJPEGファイルが表示されました。

先ほどのSELECT文をもとにしたビューimage_ext_viewを作成します。
```sql:
CREATE VIEW image_ext_view
AS
SELECT id, name, get_image(name) FROM  image_ext;
```
Database Actionsでimage_ext_viewを検索し、結果を確認します。
```sql:
SELECT * FROM image_ext_view;
```
![スクリーンショット 2022-03-16 15.19.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/1e6a77a9-8138-a766-9187-47cbd740b89e.png)
鉛筆マークをクリックして、image列のBLOBの内容を確認します。
![スクリーンショット 2022-03-16 15.21.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/3d5fcba9-7078-31d4-f35e-0fda39fe889d.png)
「イメージ」タブをクリックします。
![スクリーンショット 2022-03-16 15.22.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/1742a655-2949-ba8d-98e1-5d30312b51d1.png)
オブジェクト・ストレージ上にあるJPEGファイルが表示されました。