Autonomous Database:DBMS_LIVE_FEEDパッケージを使用してObject Storage内のCSVファイルから表を作成しデータをロードする

# はじめに
Autonomous Databaseには、Object Storage内のファイルをデータベース内の表に自動的にロードできるライブ表フィードという機能があります。

今回は、ライブ表フィードの機能を利用して、Object Storage内のファイルから簡単に表を作成してデータをロードする手順を検証してみました。

:::note warn
注意
こちらの記事の内容はあくまで個人の実験メモ的な内容のため、こちらの内容を利用した場合のトラブルには一切責任を負いません。
また、こちらの記事の内容を元にしたOracleサポートへの問い合わせはご遠慮ください。
:::

# 1. 事前準備

Object Storageバケットを作成します。
今回はbucket-testという名前のバケットを作成しました。
![スクリーンショット 2025-03-05 13.00.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/27de50e9-f42e-4a41-a38b-15252d75664c.png)

作成したバケット内にCSVファイルをアップロードします。
今回はcpu_util.csvという以下のような内容のCSVファイルを準備し、バケットbucket-testにアップロードしました。
```txt:cpu_util.csv
timestamp, value
04-MAR-25 01.00.00.000000000 AM +09:00,  0.043385726891683330
04-MAR-25 01.01.00.000000000 AM +09:00,  0.011924222369291866
04-MAR-25 01.02.00.000000000 AM +09:00,  0.039657341499751670
04-MAR-25 01.03.00.000000000 AM +09:00,  0.035015400410677670
04-MAR-25 01.04.00.000000000 AM +09:00,  0.012186000330961433
04-MAR-25 01.05.00.000000000 AM +09:00,  0.035091290198025336
04-MAR-25 01.06.00.000000000 AM +09:00,  0.011695354739048867
04-MAR-25 01.07.00.000000000 AM +09:00,  2.079555517516833400
04-MAR-25 01.08.00.000000000 AM +09:00,  0.012968172541232267
04-MAR-25 01.09.00.000000000 AM +09:00,  0.034363345470594664
04-MAR-25 01.10.00.000000000 AM +09:00,  0.013926404060465634
04-MAR-25 01.11.00.000000000 AM +09:00,  0.097125048265210330
04-MAR-25 01.12.00.000000000 AM +09:00,  0.014423142759329000
04-MAR-25 01.13.00.000000000 AM +09:00,  0.012655853470153368
04-MAR-25 01.14.00.000000000 AM +09:00,  0.033792266534282000
04-MAR-25 01.15.00.000000000 AM +09:00,  0.012097396867416734
04-MAR-25 01.16.00.000000000 AM +09:00,  0.037825281939067330
04-MAR-25 01.17.00.000000000 AM +09:00,  0.019294065740127965
04-MAR-25 01.18.00.000000000 AM +09:00,  0.012801037012521367
04-MAR-25 01.19.00.000000000 AM +09:00,  0.015361952861952867
04-MAR-25 01.20.00.000000000 AM +09:00,  0.016177005789909000
04-MAR-25 01.21.00.000000000 AM +09:00,  0.014775608661505667
04-MAR-25 01.22.00.000000000 AM +09:00,  1.833362021405716700
04-MAR-25 01.23.00.000000000 AM +09:00,  0.015393357607856133
04-MAR-25 01.24.00.000000000 AM +09:00,  0.051891778303125670
04-MAR-25 01.25.00.000000000 AM +09:00,  0.060095443010040670
04-MAR-25 01.26.00.000000000 AM +09:00,  0.015145047429958100
04-MAR-25 01.27.00.000000000 AM +09:00,  0.013211429201831333
04-MAR-25 01.28.00.000000000 AM +09:00,  0.012831479897348166
04-MAR-25 01.29.00.000000000 AM +09:00,  0.034398102173673330
04-MAR-25 01.30.00.000000000 AM +09:00,  0.012298146922567834
04-MAR-25 01.31.00.000000000 AM +09:00,  0.040237189034144330
04-MAR-25 01.32.00.000000000 AM +09:00,  0.012023060796645700
04-MAR-25 01.33.00.000000000 AM +09:00,  0.152554623766330000
04-MAR-25 01.34.00.000000000 AM +09:00,  0.015451486568481434
04-MAR-25 01.35.00.000000000 AM +09:00,  0.011620056263445300
04-MAR-25 01.36.00.000000000 AM +09:00,  0.035696237448968330
04-MAR-25 01.37.00.000000000 AM +09:00,  1.737871166997573300
04-MAR-25 01.38.00.000000000 AM +09:00,  0.020287733467945466
04-MAR-25 01.39.00.000000000 AM +09:00,  0.011145678195156933
04-MAR-25 01.40.00.000000000 AM +09:00,  0.015791395640762300
04-MAR-25 01.41.00.000000000 AM +09:00,  0.034856811786128000
04-MAR-25 01.42.00.000000000 AM +09:00,  0.018865201344130434
04-MAR-25 01.43.00.000000000 AM +09:00,  0.012458926011688166
04-MAR-25 01.44.00.000000000 AM +09:00,  0.043166280736575000
04-MAR-25 01.45.00.000000000 AM +09:00,  0.013154324154837234
04-MAR-25 01.46.00.000000000 AM +09:00,  0.012927555408534566
04-MAR-25 01.47.00.000000000 AM +09:00,  0.047049162257495670
04-MAR-25 01.48.00.000000000 AM +09:00,  0.013755651119197267
04-MAR-25 01.49.00.000000000 AM +09:00,  0.012735875947779500
04-MAR-25 01.50.00.000000000 AM +09:00,  0.012361731458505667
04-MAR-25 01.51.00.000000000 AM +09:00,  0.011334105448930067
04-MAR-25 01.52.00.000000000 AM +09:00,  1.932325671131690000
04-MAR-25 01.53.00.000000000 AM +09:00,  0.036085543199315666
04-MAR-25 01.54.00.000000000 AM +09:00,  0.034933840555739330
04-MAR-25 01.55.00.000000000 AM +09:00,  0.014431761786600500
04-MAR-25 01.56.00.000000000 AM +09:00,  0.033545113611295000
04-MAR-25 01.57.00.000000000 AM +09:00,  0.018842401190673066
04-MAR-25 01.58.00.000000000 AM +09:00,  0.012520241760748100
04-MAR-25 01.59.00.000000000 AM +09:00,  0.011698092402690466

```

# 2. クラウド・ストレージ・リンクの作成

DBMS_SHARE.CREATE_OR_REPLACE_CLOUD_STORAGE_LINKプロシージャを使用して、クラウド・ストレージ・リンクを作成します。

・storage_link_name：作成するクラウド・ストレージ・リンクの名前を指定
・uri：クラウド・ストレージのURIを指定
```
SQL> BEGIN
  2  	 DBMS_SHARE.CREATE_OR_REPLACE_CLOUD_STORAGE_LINK (
  3  	     storage_link_name => 'MY_STORAGE_LINK',
  4  	     uri	           => 'https://<namespace>.objectstorage.ap-osaka-1.oci.customer-oci.com/n/<namespace>/b/bucket_test/o/'
  5  	 );
  6  END;
  7  /

PL/SQL procedure successfully completed.

SQL>
```
クラウド・ストレージ・リンクが正しく作成されたことを確認します。
```
SQL> SELECT storage_link_name, uri, credential_name FROM user_lineage_cloud_storage_links;

STORAGE_LINK_NAME  URI													                                                CREDENTIAL_NAME
------------------ ---------------------------------------------------------------------------------------------------- ----------------------
MY_STORAGE_LINK    https://<namespace>.objectstorage.ap-osaka-1.oci.customer-oci.com/n/<namespace>/b/bucket_test/o/

1 row selected.

SQL>
```

# 3. クラウド・ストレージ・リンクのクレデンシャルの設定
DBMS_SHARE.SET_STORAGE_CREDENTIALプロシージャを使用して、クラウド・ストレージ・リンクで使用するクレデンシャルを設定します。
ここでは、Autonomous Databaseのリソース・プリンシパルを指定しています。
```
SQL> BEGIN
  2  	 DBMS_SHARE.SET_STORAGE_CREDENTIAL (
  3  	     storage_link_name => 'MY_STORAGE_LINK',
  4  	     credential_name   => 'OCI$RESOURCE_PRINCIPAL'
  5  	 );
  6  END;
  7  /

PL/SQL procedure successfully completed.

SQL>
```
クラウド・ストレージ・リンクで使用するクレデンシャルが正しく設定されていることを確認します。
```
SQL> SELECT storage_link_name, uri, credential_name FROM user_lineage_cloud_storage_links;

STORAGE_LINK_NAME  URI													                                                CREDENTIAL_NAME
------------------ ---------------------------------------------------------------------------------------------------- ----------------------
MY_STORAGE_LINK    https://<namespace>.objectstorage.ap-osaka-1.oci.customer-oci.com/n/<namespace>/b/bucket_test/o/	    OCI$RESOURCE_PRINCIPAL

1 row selected.

SQL>
```

# 4. Object Storageバケット内のCSVファイルから表を作成
DBMS_LIVE_FEED.CREATE_FOR_STORAGE_LINKプロシージャを用いて、ライブ表フィードを作成し、表を作成してCSVからデータをロードします。
・live_feed_name：作成するライブ表フィードの名前
・storage_link_name：使用するクラウド・ストレージ・リンクの名前
・table_name：作成する表の名前
・object_filter：バケット内にあるCSVファイルの名前
```
SQL> BEGIN
  2  	 DBMS_LIVE_FEED.CREATE_FOR_STORAGE_LINK(
  3  	     live_feed_name => 'MYLIVEFEED',
  4  	     storage_link_name => 'MY_STORAGE_LINK',
  5  	     table_name => 'MYFEEDTABLE',
  6  	     object_filter => 'cpu_util.csv',
  7  	     object_filter_type => 'GLOB'
  8  	 );
  9  END;
 10  /

PL/SQL procedure successfully completed.

SQL>
```

作成されたライブ表フィードmylivefeedを確認します。
```
SQL> col feed_name for a20
SQL> col target_table_name for a20
SQL> SELECT feed_name, target_table_name FROM user_live_table_feeds;

FEED_NAME	         TARGET_TABLE_NAME
-------------------- --------------------
MYLIVEFEED	         MYFEEDTABLE

1 row selected.

SQL>
```

表myfeedtableが作成されていることを確認します。
```
SQL> col table_name for a20
SQL> SELECT table_name FROM user_tables
  2  WHERE table_name = 'MYFEEDTABLE';

TABLE_NAME
--------------------
MYFEEDTABLE

1 row selected.

SQL>
```

作成された表myfeedtableの構造を確認してみます。
```
SQL> desc myfeedtable
 Name						       　　　　　　　　　　　　Null?	Type
 ----------------------------------------------------- -------- ------------------------------------
 TIMESTAMP							　　　　　　　　　　　　　　　　　VARCHAR2(4000)
 VALUE								　　　　　　　　　　　　　　　　　NUMBER

SQL>
```
CSVファイルの1行目のヘッダの情報が列名として設定されていることが確認できました。

表myfeedtableの内容を確認します。
```
SQL> SELECT * FROM myfeedtable;

TIMESTAMP							                         VALUE
------------------------------------------------------------ ----------
04-MAR-25 01.00.00.000000000 AM +09:00			             .043385727
04-MAR-25 01.01.00.000000000 AM +09:00			             .011924222
04-MAR-25 01.02.00.000000000 AM +09:00			             .039657341
04-MAR-25 01.03.00.000000000 AM +09:00			             .0350154
04-MAR-25 01.04.00.000000000 AM +09:00				         .012186
04-MAR-25 01.05.00.000000000 AM +09:00			             .03509129
04-MAR-25 01.06.00.000000000 AM +09:00			             .011695355
04-MAR-25 01.07.00.000000000 AM +09:00			            2.07955552
04-MAR-25 01.08.00.000000000 AM +09:00			            .012968173
04-MAR-25 01.09.00.000000000 AM +09:00			            .034363345
04-MAR-25 01.10.00.000000000 AM +09:00			            .013926404
04-MAR-25 01.11.00.000000000 AM +09:00			            .097125048
04-MAR-25 01.12.00.000000000 AM +09:00			            .014423143
04-MAR-25 01.13.00.000000000 AM +09:00			            .012655853
04-MAR-25 01.14.00.000000000 AM +09:00			            .033792267
04-MAR-25 01.15.00.000000000 AM +09:00			            .012097397
04-MAR-25 01.16.00.000000000 AM +09:00			            .037825282
04-MAR-25 01.17.00.000000000 AM +09:00			            .019294066
04-MAR-25 01.18.00.000000000 AM +09:00			            .012801037
04-MAR-25 01.19.00.000000000 AM +09:00			            .015361953
04-MAR-25 01.20.00.000000000 AM +09:00			            .016177006
04-MAR-25 01.21.00.000000000 AM +09:00			            .014775609
04-MAR-25 01.22.00.000000000 AM +09:00			            1.83336202
04-MAR-25 01.23.00.000000000 AM +09:00			            .015393358
04-MAR-25 01.24.00.000000000 AM +09:00			            .051891778
04-MAR-25 01.25.00.000000000 AM +09:00			            .060095443
04-MAR-25 01.26.00.000000000 AM +09:00			            .015145047
04-MAR-25 01.27.00.000000000 AM +09:00			            .013211429
04-MAR-25 01.28.00.000000000 AM +09:00			            .01283148
04-MAR-25 01.29.00.000000000 AM +09:00			            .034398102
04-MAR-25 01.30.00.000000000 AM +09:00			            .012298147
04-MAR-25 01.31.00.000000000 AM +09:00			            .040237189
04-MAR-25 01.32.00.000000000 AM +09:00			            .012023061
04-MAR-25 01.33.00.000000000 AM +09:00			            .152554624
04-MAR-25 01.34.00.000000000 AM +09:00			            .015451487
04-MAR-25 01.35.00.000000000 AM +09:00			            .011620056
04-MAR-25 01.36.00.000000000 AM +09:00			            .035696237
04-MAR-25 01.37.00.000000000 AM +09:00			           1.73787117
04-MAR-25 01.38.00.000000000 AM +09:00			            .020287733
04-MAR-25 01.39.00.000000000 AM +09:00			            .011145678
04-MAR-25 01.40.00.000000000 AM +09:00			            .015791396
04-MAR-25 01.41.00.000000000 AM +09:00			            .034856812
04-MAR-25 01.42.00.000000000 AM +09:00			            .018865201
04-MAR-25 01.43.00.000000000 AM +09:00			            .012458926
04-MAR-25 01.44.00.000000000 AM +09:00			            .043166281
04-MAR-25 01.45.00.000000000 AM +09:00			            .013154324
04-MAR-25 01.46.00.000000000 AM +09:00			            .012927555
04-MAR-25 01.47.00.000000000 AM +09:00			            .047049162
04-MAR-25 01.48.00.000000000 AM +09:00			            .013755651
04-MAR-25 01.49.00.000000000 AM +09:00			            .012735876
04-MAR-25 01.50.00.000000000 AM +09:00			            .012361731
04-MAR-25 01.51.00.000000000 AM +09:00			            .011334105
04-MAR-25 01.52.00.000000000 AM +09:00			            1.93232567
04-MAR-25 01.53.00.000000000 AM +09:00			            .036085543
04-MAR-25 01.54.00.000000000 AM +09:00			            .034933841
04-MAR-25 01.55.00.000000000 AM +09:00			            .014431762
04-MAR-25 01.56.00.000000000 AM +09:00			            .033545114
04-MAR-25 01.57.00.000000000 AM +09:00			            .018842401
04-MAR-25 01.58.00.000000000 AM +09:00			            .012520242
04-MAR-25 01.59.00.000000000 AM +09:00			            .011698092

60 rows selected.

SQL> 
```

表myfeedtableが作成され、Object Storage内のCSVファイルcpu_util.csvの内容がロードされていることが確認できました。

# 5.ライブ表フィードの削除

CSVファイルからのデータロードが完了したので、DBMS_LIVE_FEED.DROP_LIVE_FEEDプロシージャを使用して作成したライブ表フィードmylivefeedを削除します。
```
SQL> EXEC DBMS_LIVE_FEED.DROP_LIVE_FEED(live_feed_name => 'MYLIVEFEED');

PL/SQL procedure successfully completed.

SQL>
```
ライブ表フィードmylivefeedが削除されたことを確認します。
```
SQL> SELECT feed_name, target_table_name FROM user_live_table_feeds;

no rows selected

SQL>
```

ライブ表フィード作成時に作成された表myfeedtableが削除されていないことを確認します。
```
SQL> SELECT table_name FROM user_tables
  2  WHERE table_name = 'MYFEEDTABLE';

TABLE_NAME
--------------------
MYFEEDTABLE

1 row selected.

SQL>
```

ライブ表フィードmylivefeedを削除しても、ライブ表フィードによって作成された表myfeedtableは削除されないことが確認できました。

# 参考情報
・[DBMS_SHARE.CREATE_OR_REPLACE_CLOUD_STORAGE_LINKプロシージャ](https://docs.oracle.com/cd/E83857_01/paas/autonomous-database/serverless/adbsb/dbms-share-producer.html#GUID-C8836FCE-E0B0-4D07-82D4-C43E6C5EC82C)
・[DBMS_SHARE.SET_STORAGE_CREDENTIALプロシージャ](https://docs.oracle.com/cd/E83857_01/paas/autonomous-database/serverless/adbsb/dbms-share-producer.html#GUID-06F73F56-5F67-4045-8CDD-A24B8009FEFB)
・[DBMS_LIVE_FEED.CREATE_FOR_STORAGE_LINKプロシージャ](https://docs.oracle.com/ja-jp/iaas/autonomous-database-serverless/doc/ive-feed.html#GUID-FFF98E3B-9432-45D3-A384-E55866D62AB2__GUID-2EE6575F-263D-4DA3-9BBA-137EBE02D396)
・[DBMS_LIVE_FEED.DROP_LIVE_FEEDプロシージャ](https://docs.oracle.com/ja-jp/iaas/autonomous-database-serverless/doc/ive-feed.html#GUID-FFF98E3B-9432-45D3-A384-E55866D62AB2__GUID-185A2F7B-8BB4-418F-9B67-295D0742F3DA)