はじめに

こんにちは。Oracle Cloud Infrastructure検証チームです。

今回は【OCI】BaseDBでオブジェクトストレージを利用する(DBMS_CLOUD編②)の続きとなります。

前回、DBMS_CLOUDパッケージを利用してオブジェクトストレージにアクセスできたので、今回は実際にオブジェクトストレージの中を参照してみます。

  1. 事前準備1
  2. 事前準備2
  3. 実践(今回)

オブジェクトのアップロード

オブジェクトストレージに「ocitutorials_sales.csv」というCSVファイルをアップロードします。
CSVファイルの中身は以下になります。

ocitutorials_sales.csv
===============================
C,CHANNEL_LONG,CHANNEL_CLASS
S,Direct Sales,Direct
T,Table Sales,Direct
C,Catalog,Indirect
I,Internet,Indirect
P,Partners,Others
===============================

オブジェクトの参照

アップロードしたオブジェクトがDB上から参照できるか確認するため、PDBに接続して以下のSQL実行します。
select * from dbms_cloud.list_objects('<クレデンシャル名>','<オブジェクト・ストレージのバケットのURL>');

[oracle@ocitest ~]$ sqlplus DBMSTEST@PDB_ORCL 

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Apr 22 22:59:39 2026 
Version 19.28.0.0.0 

Copyright (c) 1982, 2025, Oracle. All rights reserved. 

Enter password: 
Last Successful login time: Fri Apr 17 2026 18:36:15 +09:00 

Connected to: 
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production 
Version 19.28.0.0.0 

SQL> select * from dbms_cloud.list_objects
('DBMS_CLOUD_TEST','https://objectstorage.ap-tokyo-1.oraclecloud.com/n/XXXXXXXXXXXX/b/demo/o');
OBJECT_NAME BYTES CHECKSUM CREATED LAST_MODIFIED 
------------------------------ ---------- ----------------------------------- ----------------------------------
------ ---------------------------------------- 
ocitutorials_sales.csv 132 7029e5380089724434873278cfae43b4 
17-APR-26 08.06.10.430000 AM +09:00 

DB上からアップロードした「ocitutorials_sales.csv」を参照することができました。

CSVファイルを外部表で取込

次にDBMS_CLOUDパッケージの機能である DBMS_CLOUD.CREATE_EXTERNAL_TABLE を利用し、外部表としてCSVファイルを参照・定義します。
PDBに接続して、DBMS_CLOUD.CREATE_EXTERNAL_TABLE を実行します。
※file_uri_list でファイル名までURL指定する必要があります。

[oracle@ocitest ~]$ sqlplus DBMSTEST@PDB_ORCL 

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Apr 22 23:07:32 2026

Version 19.28.0.0.0

Copyright (c) 1982, 2025, Oracle. All rights reserved.

Enter password: 
Last Successful login time: Wed Apr 22 2026 22:59:42 +09:00

Connected to: 
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production 
Version 19.28.0.0.0 

SQL> 
SQL> select * from TUTORIAL_SALES;
select * from TUTORIAL_SALES
*
ERROR at line 1:
ORA-00942: table or view does not exist
★ 実行前のためエラーが発生

SQL> 
SQL> 
SQL> begin DBMS_CLOUD.CREATE_EXTERNAL_TABLE(table_name=>'TUTORIAL_SALES',
2 credential_name => 'DBMS_CLOUD_TEST',
3 file_uri_list => 'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/XXXXXXXXXXXX/b/demo/o/ocitutorials_sales.csv',
4 format => json_object('delimiter' value ',' ),
5 column_list =>'channel_short varchar2(1),
6 channel_long varchar2(20),
7 channel_class varchar2(20)');
8 end;
9 /
PL/SQL procedure successfully completed.

SQL> 
SQL> select * from TUTORIAL_SALES;

C CHANNEL_LONG CHANNEL_CLASS
- -------------------- --------------------
C CHANNEL_LONG CHANNEL_CLASS
S Direct Sales Direct
T Table Sales Direct
C Catalog Indirect
I Internet Indirect
P Partners Others

6 rows selected.

DBMS_CLOUD.CREATE_EXTERNAL_TABLE 実行後のSELECT結果が変わり、オブジェクトにアップロードしたCSVファイルと同じデータであることが確認できました。

CSVファイルを実表で取込

先ほどは外部表を参照しているため、実データはデータベース内にありません。
CREATE TABLE ... AS SELECT文で外部表を実表に取り込むことも可能ですが、今回はテーブルを事前に作成して実データとして取り込んでみたいと思います。
PDBに接続して、事前にテーブルを作成します。その後 DBMS_CLOUD.COPY_DATA を実行します。

[oracle@ocitest ~]$ sqlplus DBMSTEST@PDB_ORCL 

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Apr 22 23:07:32 2026

Version 19.28.0.0.0

Copyright (c) 1982, 2025, Oracle. All rights reserved.

Enter password: 
Last Successful login time: Wed Apr 22 2026 22:59:42 +09:00

Connected to: 
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production 
Version 19.28.0.0.0 

SQL> 
SQL> CREATE TABLE TUTORIAL_SALES2
2 (channel_id CHAR(1),
3 channel_desc VARCHAR2(20),
4 channel_class VARCHAR2(20)
5 );

Table created.

SQL> 
SQL> select * from TUTORIAL_SALES2;

no rows selected
★ 取込前なので何もデータが無い

SQL> BEGIN
2 DBMS_CLOUD.COPY_DATA(
3 table_name =>'TUTORIAL_SALES2',
4 credential_name =>'DBMS_CLOUD_TEST',
5 file_uri_list =>'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/XXXXXXXXXXXX/b/demo/o/ocitutorials_sales.csv',
6 format => json_object('delimiter' value ',')
7 );
8 END;
9 /
PL/SQL procedure successfully completed.

SQL> select * from TUTORIAL_SALES2;

C CHANNEL_DESC CHANNEL_CLASS
- -------------------- --------------------
C CHANNEL_LONG CHANNEL_CLASS
S Direct Sales Direct
T Table Sales Direct
C Catalog Indirect
I Internet Indirect
P Partners Others

6 rows selected.

DBMS_CLOUD.COPY_DATA 実行後のSELECT結果が変わり、外部表と同じデータであることが確認できました。

最後に

いかがでしょうか。
ローカル領域を経由しなくてもオブジェクトストレージにあるオブジェクトを参照や取り込みできました。

ここまで見ていただいたところでCSVファイルではなく、直接ダンプファイルをインポートできないのか?といった疑問を持った方もいらっしゃるかと思います。
残念ながら19cはData Pumpを使用したダイレクト転送はサポートされていません。
21.3以降のバージョンで直接インポートすることが可能になっています。

次回は最新の26ai環境でDBMS_CLOUDパッケージを使用してダンプファイルを直接インポートしてみたいと思います。

次回もよろしくお願いします。

OCIの専門家が多数在籍!


Oracleの相談をする›

最適な解決策をご提供

 

投稿者プロフィール

技術チーム
技術チーム
DBひとりでできるもんを盛り上げるべく、技術チームが立ち上がり早8年。ひとりでできるもんと言いつつ、技術者が読んでプッとなるような、極めてピンポイントでマニアックな技術ネタを執筆しています!
最新技術情報や資格情報をチェックしたいアナタ!毎日遊びに来てください。きっとお役に立てます。