はじめに
Autonomous AI Database(ADB)に付属するETLツールであるData Transformsはさまざまなデータソースをサポートしています。そのなかでは読取りはOKですが、書き込みはNGというものもいくつかあります。その1つがGoogle Cloud Storage(GCS)です。一方でAutonomous AI DatabaseはDBMS_CLOUD.EXPORT_DATAを利用してクラウド・ストレージへの出力が可能です。
Data Transformsで変換まで行ってDBMS_CLOUD.EXPORT_DATAで出力を行えないか試してみました。
前提
- Autonomous AI Database 19c(ADB)をプライベート・エンドポイントで作成済み
- Base Database 19c(BaseDB)cのインスタンスをADBと同じVCNのプライベート・エンドポイントで作成し、プラガブルデータベースを作成済み
- GCSのバケットを用意
1.検証用のユーザーを作成
BaseDBとADBにTESTUSERというユーザーを作成します。Base DBにはテスト表も作成します。
BaseDBで実行
次のスクリプトを実行します
BaseDB実行スクリプト
connect system/password
CREATE USER TESTUSER IDENTIFIED BY "Welcome12345#";
-- ADD ROLES
GRANT CONNECT TO TESTUSER;
GRANT RESOURCE TO TESTUSER;
-- 顧客テーブル
CREATE TABLE testuser.customers (
customer_id NUMBER PRIMARY KEY,
customer_name VARCHAR2(100),
address VARCHAR2(200)
);
INSERT INTO testuser.customers VALUES (1, '田中 太郎', '東京都品川区');
INSERT INTO testuser.customers VALUES (2, '鈴木 花子', '大阪府大阪市');
INSERT INTO testuser.customers VALUES (3, '佐藤 次郎', '東京都杉並区');
INSERT INTO testuser.customers VALUES (4, '高橋 美咲', '東京都新宿区');
INSERT INTO testuser.customers VALUES (5, '伊藤 健', '神奈川県横浜市');
INSERT INTO testuser.customers VALUES (6, '中村 亮', '東京都世田谷区');
INSERT INTO testuser.customers VALUES (7, '小林 渚', '千葉県千葉市');
INSERT INTO testuser.customers VALUES (8, '加藤 翔', '東京都渋谷区');
INSERT INTO testuser.customers VALUES (9, '吉田 麻衣', '東京都中野区');
INSERT INTO testuser.customers VALUES (10, '山本 一郎', '埼玉県さいたま市');
-- 取引テーブル
CREATE TABLE testuser.transactions (
transaction_id NUMBER PRIMARY KEY,
customer_id NUMBER,
amount NUMBER,
transaction_date DATE,
FOREIGN KEY (customer_id) REFERENCES testuser.customers(customer_id)
);
INSERT INTO testuser.transactions VALUES (1001, 1, 8000, TO_DATE('2024-06-01','YYYY-MM-DD'));
INSERT INTO testuser.transactions VALUES (1002, 2, 3000, TO_DATE('2024-06-02','YYYY-MM-DD'));
INSERT INTO testuser.transactions VALUES (1003, 3, 12000, TO_DATE('2024-06-05','YYYY-MM-DD'));
INSERT INTO testuser.transactions VALUES (1004, 4, 6000, TO_DATE('2024-06-06','YYYY-MM-DD'));
INSERT INTO testuser.transactions VALUES (1005, 5, 4500, TO_DATE('2024-06-07','YYYY-MM-DD'));
INSERT INTO testuser.transactions VALUES (1006, 6, 5200, TO_DATE('2024-06-08','YYYY-MM-DD'));
INSERT INTO testuser.transactions VALUES (1007, 7, 9500, TO_DATE('2024-06-08','YYYY-MM-DD'));
INSERT INTO testuser.transactions VALUES (1008, 8, 11000, TO_DATE('2024-06-09','YYYY-MM-DD'));
INSERT INTO testuser.transactions VALUES (1009, 9, 7000, TO_DATE('2024-06-10','YYYY-MM-DD'));
INSERT INTO testuser.transactions VALUES (1010, 10, 2000, TO_DATE('2024-06-10','YYYY-MM-DD'));
ADBで実行
ユーザーTESTUSERを作成します
CREATE USER TESTUSER IDENTIFIED BY "Welcome12345#";
-- ADD ROLES
GRANT CONNECT TO TESTUSER;
GRANT DWROLE TO TESTUSER;
GRANT RESOURCE TO TESTUSER;
ALTER USER TESTUSER DEFAULT ROLE DWROLE;
2.ADBからGCSへアクセスできるようにする
以下の記事を参照してにADBからCGSへアクセスできるように設定を行いました。
[OCI]GCPのサービスアカウントを使用してAutonomous DatabaseからGoogle Cloud Storageにアクセスしてデータ連携してみた
設定した結果を記載しておきます。
2-1. Autonomous DatabaseでGCPのサービスアカウントを有効化
有効化のコマンドを実行し
BEGIN
DBMS_CLOUD_ADMIN.ENABLE_PRINCIPAL_AUTH(
provider => 'GCP' );
END;
/
サービスアカウントを確認しました。
SELECT * FROM cloud_integrations WHERE param_name = 'gcp_service_account';
PARAM_NAME PARAM_VALUE
------------------- ---------------------------------------------------------
gcp_service_account GCP-SA-3010-62179@gcp-pa-project1.iam.gserviceaccount.com
2-1. Google Cloudのロールの作成
記事の手順に従ってロールを作成しました。
2-3. Google Cloud Storageの準備
記事の手順に従ってGCSの準備をしました。
3.ADBからGCSへの書き込みができることを確認する
DBMS_CLOUDパッケージのEXPORT_DATAはドキュメントにあるとおり、クラウドストレージへの書き込みが可能です。
Googleサービスアカウントを利用する場合、クレデンシャルにはGCP$PAを指定します。
また、file_uri_listには、以下のような仮想ホスト形式でバケットと出力ファイル名を指定します。
https://バケット名.storage.googleapis.com/ファイル名
ADMINユーザーで次を実行します。
BEGIN
DBMS_CLOUD.EXPORT_DATA(
credential_name => 'GCP$PA',
file_uri_list => 'https://gcp-cloud-storage-bucket-adb.storage.googleapis.com/test1.csv',
query => 'SELECT 1,systimestamp FROM dual',
format => JSON_OBJECT('type' value 'csv'));
END;
/
GCSのバケットを確認すると、ファイルが出力されていることを確認できました。(ファイル名には識別子が付きます。)
4.Data Transformsでデータの接続を作成する
以下の記事を参照して。Data Transformsを起動し、ADB、BaseDBの接続を作成します。
[Autonomous Database]Data Transformsでプライベート・エンドポイントのBase Databaseにアクセスしてみる
今回は同じVCN上のプライベートエンドポイントを利用しているので、「VCNのローカルピアリング」の項目は不要です。次の項目を実施します。
- プライベート・エンドポイントアクセスのための設定
- Data Transformsで接続の作成
5.Data Transformsでデータ・フローを作成する
チュートリアルを参考にして以下の条件を満たすデータ・フローを作成しました。
- 2つのテーブルをcustomer_idで結合(Join)
- 取引金額が5000円以上の明細を抽出(Filter)
- 取引金額から手数料(例: 3%)を差し引いた純利益を計算(Expression)
- 住所に含まれる"東京都"を"TOKYO"に置換(Replace)
- 出力先としてADBにcustomer_transactions_tableを新規に作成(存在する場合は削除して再作成)
■ 作成したデータフロー
■ Expressionの設定
新しい属性"NET_INCOME"を追加し、手数料を引いた値(*0.97)になるよう定義します。

■ Replaceの設定
ADDRESS属性で文字列'東京都'を'TOKYO'に変更するよう指定します。

■ 新規に作成する表の設定
ADDRESSとマッピングする属性はREPLACEのRETURNに指定します。

オプションで"Drop and create target table"をTrueに変更します。

データフローが作成できたので実行してみます。
ADBに接続して、SQLでCUSTOMER_TRANSACTIONS_TABLEを確認します。条件にあったデータが出力されています。
select * from TESTUSER.CUSTOMER_TRANSACTIONS_TABLE ;
CUSTOMER_ID TRANSACTION_ID CUSTOMER_NAME ADDRESS AMOUNT TRANSACTION_DATE NET_INCOME
----------- -------------- ------------- --------- ------ ----------------- ----------
1 1001 田中 太郎 TOKYO品川区 8000 2024/6/1 0:00:00 7760
3 1003 佐藤 次郎 TOKYO杉並区 12000 2024/6/5 0:00:00 11640
4 1004 高橋 美咲 TOKYO新宿区 6000 2024/6/6 0:00:00 5820
6 1006 中村 亮 TOKYO世田谷区 5200 2024/6/8 0:00:00 5044
7 1007 小林 渚 千葉県千葉市 9500 2024/6/8 0:00:00 9215
8 1008 加藤 翔 TOKYO渋谷区 11000 2024/6/9 0:00:00 10670
9 1009 吉田 麻衣 TOKYO中野区 7000 2024/6/10 0:00:00 6790
Elapsed: 00:00:00.042
7行が選択されました。
6.Data Transformsでワークフローを作成する
データフローで出力された結果をGCSに出力するため、データフローの後にPL/SQLでDBMS_CLOUD.EXPORT_DATAを実行するようワークフローを作成します。ワークフローでは作成済みのデータフローやワークフロー等のコンポーネントのほか、スリープやSQLを組み込めます。
SQLで接続先をADB、そして3で確認したPL/SQLコードのQueryを以下のSQLに、出力ファイル名をtest1.csvからcustomer_transactions.csvに変更したコードを記述します。
select * from testuser.customer_transactions_table
データフローと同じように右下のステータスが完了になれば成功です。

GCSのバケットを確認します。customer_transactions_識別子.csvというファイルが出力されました。
ダウンロードして内容を確認すると、正しくデータが出力されていました。
おわりに
Data TransformsとDBMS_CLOUDパッケージを利用してBaseDBのデータをADB経由でGCSへ出力することができました。ADBは今回ステージング的な役割でしたが、そのままSelect AIやAI Agentを利用して、データ活用するなんてこともよいのでは?!と思いました。














