クラウドのファイルからのデータのロード
PL/SQLパッケージDBMS_CLOUD
は、クラウドのファイルからAutonomous Database on Dedicated Exadata Infrastructureで作成された表へのデータのロードをサポートします。
DBMS_CLOUD
で提供される次のPL/SQLプロシージャを使用して、様々なファイル・フォーマットからデータをロードできます:
- クラウドのテキスト・ファイル(
DBMS_CLOUD.COPY_DATA
プロシージャを使用) - クラウドのJSONファイル(
DBMS_CLOUD.COPY_TEXT
プロシージャを使用)
- ソース・ファイルは、クライアント・コンピュータでローカル・ファイルとして使用可能な場合もあれば、Oracle Cloud Infrastructure Object Storageなどのクラウドベースのオブジェクト・ストアにアップロードして、データのロードを試行するデータベース・ユーザーがそれにアクセスできるようにする場合もあります。
- クラウド・オブジェクト・ストレージ資格証明は、
DBMS_CLOUD.CREATE_CREDENTIAL
プロシージャを使用して格納されます。詳細は、資格証明の作成を参照してください。
パッケージDBMS_CLOUD
は、次のクラウド・サービスのファイルからのロードをサポートしています: Oracle Cloud Infrastructure Object Storage、Oracle Cloud Infrastructure Object Storage Classic、Azure Blob StorageおよびAmazon S3。
- 資格証明の作成
DBMS_CLOUD.CREATE_CREDENTIAL
プロシージャを使用してクラウド・オブジェクト・ストレージ資格証明を格納する方法について学習します。 - テキスト・ファイルからのデータのロード
DBMS_CLOUD.COPY_DATA
プロシージャを使用してクラウドのテキスト・ファイルからAutonomous Databaseにデータをロードする方法について学習します。 - コレクションへの区切りドキュメントのJSONファイルのロード
DBMS_CLOUD.COPY_DATA
プロシージャを使用して、区切りドキュメントのJSONファイルをAutonomous Database内のコレクションにロードする方法について説明します。 - コレクションへのJSONドキュメントの配列のロード
DBMS_CLOUD.COPY_COLLECTION
プロシージャを使用して、JSONドキュメントの配列をAutonomous Database内のコレクションにロードする方法について学習します。 - 既存の表へのJSONデータのコピー
DBMS_CLOUD.COPY_DATA
を使用して、クラウド内のJSONデータを表にロードします。 - 拡張スカラー値を表すテキストのJSONオブジェクト
ネイティブ・バイナリJSONデータ(OSON形式)は、SQL型に対応していてJSON標準には含まれてないスカラー型(dateなど)の追加によってJSON言語を拡張します。Oracle Databaseでは、表現するテキストJSONオブジェクト(このような非標準値を含む)の使用もサポートされています。 - データ・ロードのモニターとトラブルシューティング
PL/SQLパッケージ
を使用して実行されたデータ・ロード操作は、表DBMS_CLOUD
dba_load_operations
およびuser_load_operations
に記録されます:
親トピック: Autonomous Databaseへのデータの移動
資格証明の作成
DBMS_CLOUD.CREATE_CREDENTIAL
プロシージャを使用してクラウド・オブジェクト・ストレージ資格証明を格納する方法について学習します。
DBMS_CLOUD.CREATE_CREDENTIAL
プロシージャを実行します。例:BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL
(
credential_name => 'DEF_CRED_NAME',
username => 'adb_user@oracle.com',
password => 'password'
);
END;
/
username
およびpassword
に指定する値は、使用しているクラウド・オブジェクト・ストレージ・サービスによって異なります:
-
Oracle Cloud Infrastructure Object Storage:
username
はOracle Cloud Infrastructureのユーザー名で、password
はOracle Cloud Infrastructureの認証トークンです。認証トークンの作業を参照してください。 -
Oracle Cloud Infrastructure Object Storage Classic:
username
はOracle Cloud Infrastructure Classicのユーザー名で、password
はOracle Cloud Infrastructure Classicのパスワードです。
この操作によって、資格証明が暗号化された形式でデータベースに格納されます。資格証明には任意の名前を使用できます。オブジェクト・ストアの資格証明を変更しないかぎり、このステップが必要なのは1回のみです。資格証明を格納した後は、すべてのデータ・ロードで同じ資格証明名を使用できます。
親トピック: クラウドのファイルからのデータのロード
テキスト・ファイルからのデータのロード
DBMS_CLOUD.COPY_DATA
プロシージャを使用してクラウドのテキスト・ファイルからAutonomous Databaseにデータをロードする方法について学習します。
この例のソース・ファイルchannels.txt
には、次のデータが含まれています:
S,Direct Sales,Direct T,Tele Sales,Direct C,Catalog,Indirect I,Internet,Indirect P,Partners,Others
親トピック: クラウドのファイルからのデータのロード
コレクションへの区切りドキュメントのJSONファイルのロード
DBMS_CLOUD.COPY_DATA
プロシージャを使用して、区切りドキュメントのJSONファイルをAutonomous Database内のコレクションにロードする方法について学習します。
この例では、行区切りファイルからJSON値をロードし、JSONファイルmyCollection.json
を使用します。各値(各行)は、Autonomous Database上のコレクションに単一のドキュメントとしてロードされます。
このようなファイルの例を次に示します。3つの行があり、各行に1つのオブジェクトがあります。これらのオブジェクトはそれぞれ個別のJSONドキュメントとしてロードされます。
{ "name" : "apple", "count": 20 } { "name" : "orange", "count": 42 } { "name" : "pear", "count": 10 }
親トピック: クラウドのファイルからのデータのロード
コレクションへのJSONドキュメントの配列のロード
DBMS_CLOUD.COPY_COLLECTION
プロシージャを使用して、JSONドキュメントの配列をAutonomous Database内のコレクションにロードする方法について学習します。
この例では、JSONファイルfruit_array.json
を使用します。次に、ファイルfruit_array.json
の内容を示します:
[{"name" : "apple", "count": 20 }, {"name" : "orange", "count": 42 }, {"name" : "pear", "count": 10 }]
親トピック: クラウドのファイルからのデータのロード
JSONデータを既存の表にコピー
DBMS_CLOUD.COPY_DATA
を使用して、クラウド内のJSONデータを表にロードします。
この例では、ソース・ファイルはJSONデータ・ファイルです。
親トピック: クラウドのファイルからのデータのロード
拡張スカラー値を表すテキストのJSONオブジェクト
ネイティブ・バイナリJSONデータ(OSON形式)は、SQL型に対応し、JSON標準に含まれないスカラー型(日付など)を追加することで、JSON言語を拡張します。Oracle Databaseでは、表現するテキストJSONオブジェクト(このような非標準値を含む)の使用もサポートされています。
このような拡張オブジェクトを含むテキストJSONデータからネイティブ・バイナリJSONデータを作成する場合、必要に応じて、対応する(ネイティブ・バイナリ) JSONスカラー値に置換できます。
拡張オブジェクトの例は、{"$numberDecimal":31}
です。これは、非標準の10進数型のJSONスカラー値を表し、そのように解釈されると、ネイティブ・バイナリ形式の10進数に置換されます。
たとえば、JSONデータ・タイプ・コンストラクタJSON
を使用する場合、キーワードEXTENDED
を使用すると、テキストの入力で認識された拡張オブジェクトがネイティブ・バイナリJSONの結果では対応するスカラー値に置き換えられます。キーワードEXTENDED
を含めなければ、このような置換は発生しません。テキストの拡張JSONオブジェクトは、ネイティブ・バイナリ形式のJSONオブジェクトにそのまま変換されるだけです。
逆に、Oracle SQLファンクションjson_serialize
を使用してバイナリJSONデータをテキストJSONデータ(VARCHAR2
、CLOB
またはBLOB
)としてシリアライズする場合は、キーワードEXTENDED
を使用して、(ネイティブ・バイナリ) JSONスカラー値を対応するテキスト拡張JSONオブジェクトに置き換えることができます。
使用するデータベースがOracle Autonomous Databaseの場合、PL/SQLプロシージャDBMS_CLOUD.copy_collection
を使用して、Oracle NoSQL Databaseなどの一般的なNoSQLデータベースによって生成されるようなJSONデータのファイルからJSONドキュメント・コレクションを作成できます。
ejson
をプロシージャのtype
パラメータの値として使用すると、入力ファイルで認識された拡張JSONオブジェクトが、結果のネイティブ・バイナリJSONコレクションでは対応するスカラー値に置き換えられます。もう1つの方向では、ファンクションjson_serialize
をキーワードEXTENDED
とともに使用して、結果のテキストJSONデータでスカラー値を拡張JSONオブジェクトに置き換えることができます。
拡張オブジェクトには、主に次の2つのユースケースがあります:
-
交換(インポート/エクスポート):
-
拡張オブジェクトを含む既存のJSONデータを(任意の場所から)取り込みます。
-
ネイティブ・バイナリJSONデータは、データベース外で使用するために、拡張オブジェクトを含むテキストJSONデータとしてシリアル化します。
-
-
ネイティブ・バイナリJSONデータの検査: 対応する拡張オブジェクトを参照して、内容を確認します。
交換目的の場合は、Oracle NoSQL Databaseなどの一般的なNoSQLデータベースによって生成されたファイルからJSONデータを取り込み、拡張オブジェクトをネイティブ・バイナリJSONスカラーに変換できます。一方、ネイティブ・バイナリJSONデータをテキスト・データとしてエクスポートし、Oracle固有スカラーJSON値を対応するテキスト拡張JSONオブジェクトに置き換えることができます。
ヒント:
検査の例として、ネイティブJSONデータをシリアル化した結果として、{"dob" : "2000-01-02T00:00:00"}
などのオブジェクトを検討します。"2000-01-02T00:00:00"
は、日付型のネイティブ・バイナリ値をシリアライズした結果ですか。それとも、ネイティブ・バイナリ値は単に文字列ですか。キーワードEXTENDED
を指定してjson_serialize
を使用するとわかります。
拡張オブジェクト・フィールドのスカラーJSON型へのマッピングは、一般に多対1です。複数の種類の拡張JSONオブジェクトを特定の1つのスカラー値にマップできます。たとえば、拡張JSONオブジェクト{"$numberDecimal":"31"}
および{"$numberLong:"31"}
は、両方とも値31 of JSON-languageスカラー型numberとして変換され、項目メソッドtype()
はこれらの各JSONスカラーについて"number"
を返します。
項目メソッドtype()
は、対象値のJSON言語スカラー型を(JSON文字列として)報告します。一部のスカラー値は、同じスカラー型であっても内部的に区別できます。これにより、通常、ファンクションjson_serialize
(キーワードEXTENDED
を指定)は元の拡張JSONオブジェクトを再構築できます。このようなスカラー値は、異なるSQL型を使用して実装するか、導出元の拡張JSONオブジェクトの種類でタグ付けすることで、内部的に区別されます。
json_serialize
で元の拡張JSONオブジェクトを再構築する場合、結果は必ずしもオリジナルとテキスト的に同じではありませんが、常にセマンティクス的に同等です。たとえば、{"$numberDecimal":"31"}
と{"$numberDecimal":31}
は、フィールド値のタイプ(文字列と数値)が異なっていても、セマンティクスは同じです。これらは同じ内部値に変換され、それぞれが$numberDecimal
拡張オブジェクト(同じタグ)から導出されたものとしてタグ付けされます。ただし、シリアライズされると、両方の結果は{"$numberDecimal":31}
になります。Oracleでは常に、最も直接関連する型がフィールド値に使用されます。この場合は、スカラー型numberのJSON言語値31
です。
表4-1に、使用される様々な型間の対応関係を示します。(1)入力として使用される拡張オブジェクトのタイプ、(2)項目メソッドtype()
によって報告されるタイプ、(3)内部で使用されるSQLタイプ、(4)ファンクションjson_serialize
による出力として使用される標準のJSON言語タイプ、および(5)キーワードEXTENDED
が指定されている場合のjson_serialize
による拡張オブジェクト出力のタイプの間でマップします。
表4-1拡張JSONオブジェクト型の関係
拡張オブジェクト型(入力) | Oracle JSONスカラー型(type()によるレポート) | SQLスカラー型 | 標準JSONスカラー型(出力) | 拡張オブジェクト型(出力) |
---|---|---|---|---|
$numberDouble (値はJSON数値、数値を表す文字列、または"Infinity" 、"-Infinity" 、"Inf" 、"-Inf" 、"Nan" のいずれかの文字列脚注1)
|
ダブル | BINARY_DOUBLE |
数値 |
$numberDouble (値はJSON数値、または"Inf" 、"-Inf" 、"Nan" のいずれかの文字列脚注2) |
$numberFloat (値は$numberDouble と同じ) |
float | BINARY_FLOAT |
数値 |
$numberFloat (値は$numberDouble と同じ) |
$numberDecimal (値は$numberDouble と同じ) |
数値 | NUMBER |
数値 |
$numberDecimal (値は$numberDouble と同じ) |
$numberInt (値は符号付き32ビット整数または数値を表す文字列)
|
数値 | NUMBER |
数値 |
$numberInt (値は$numberDouble と同じ) |
$numberLong (値はJSON数値または数値を表す文字列)
|
数値 | NUMBER |
数値 |
$numberLong (値は$numberDouble と同じ) |
次のいずれかの値を持つ
値がbase-64文字列の場合、拡張オブジェクトに |
バイナリ | BLOB またはRAW |
文字列 変換は、SQLファンクション |
次のいずれかが指定されます。
|
$oid (値は24文字の文字列)
|
バイナリ | RAW(12) |
文字列 変換は、SQLファンクション |
$rawid (値は24桁の16進文字列)
|
$rawhex (値は偶数の16進文字列)
|
バイナリ | RAW |
文字列 変換は、SQLファンクション |
$binary (値はbase-64文字列、= 文字で右詰め)
|
$rawid (値は24または32桁の16進文字列)
|
バイナリ | RAW |
文字列 変換は、SQLファンクション |
$rawid |
$oracleDate (値はISO 8601日付文字列)
|
日付 | DATE |
文字列 |
$oracleDate (値はISO 8601日付文字列)
|
$oracleTimestamp (値はISO 8601タイムスタンプ文字列)
|
タイムスタンプ | TIMESTAMP |
文字列 |
$oracleTimestamp (値はISO 8601タイムスタンプ文字列)
|
$oracleTimestampTZ (値は数値のタイムゾーン・オフセットまたはZ を持つISO 8601タイムスタンプ文字列) |
タイムスタンプとタイムゾーン | TIMESTAMP WITH TIME ZONE |
文字列 |
$oracleTimestampTZ (値は数値のタイムゾーン・オフセットまたはZ を持つISO 8601タイムスタンプ文字列) |
次のいずれかの値を持つ
|
タイムスタンプとタイムゾーン | TIMESTAMP WITH TIME ZONE |
文字列 |
$oracleTimestampTZ (値は数値のタイムゾーン・オフセットまたはZ を持つISO 8601タイムスタンプ文字列) |
$intervalDaySecond (値はSQLファンクションto_dsinterval に指定されたISO 8601間隔文字列) |
daysecondInterval | INTERVAL DAY TO SECOND |
文字列 |
$intervalDaySecond (値はSQLファンクションto_dsinterval に指定されたISO 8601間隔文字列) |
SQLファンクションto_yminterval に指定されたISO 8601間隔文字列の値を持つ$intervalYearMonth |
yearmonthInterval | INTERVAL YEAR TO MONTH |
文字列 |
SQLファンクションto_yminterval に指定されたISO 8601間隔文字列の値を持つ$intervalYearMonth |
2つのフィールド:
|
ベクトル | VECTOR |
数値の配列 |
2つのフィールド:
|
脚注1 文字列値は大/小文字を区別せずに解釈されます。たとえば、"NAN"
、"nan"
および"nAn"
は同等として受け入れられ、"INF"
、"inFinity"
および"iNf"
も同様です。無限に大きい数値("Infinity"
または"Inf"
)および小さい数値("-Infinity"
または"-Inf"
)は、フルワードまたは略語で受け入れられます。
脚注2 出力では、これらの文字列値のみが使用されます。フルワードInfinityまたは大小文字のバリアントは使用されません。
親トピック: クラウドのファイルからのデータのロード
データ・ロードのモニターとトラブルシューティング
PL/SQLパッケージ
を使用して実行されたデータ・ロード操作は、表DBMS_CLOUD
dba_load_operations
およびuser_load_operations
に記録されます:
-
dba_load_operations
: すべてのロード操作が表示されます。 -
user_load_operations
: 自分のスキーマのロード操作が表示されます。
これらの表を問い合せると、進行中または完了済のデータ・ロードに関する情報が表示されます。たとえば、TYPE
列のWHERE
句述語でSELECT
文を使用すると、タイプがCOPY
のロード操作が表示されます:
SELECT table_name, owner_name, type, status, start_time, update_time, logfile_table, badfile_table
FROM user_load_operations WHERE type = 'COPY';
TABLE_NAME OWNER_NAME TYPE STATUS START_TIME UPDATE_TIME LOGFILE_TABLE BADFILE_TABLE
---------- ----------- ------- ---------- ---------------------- --------------------- --------------- ------------- ------------- -------------
CHANNELS SH COPY COMPLETED 04-MAR-21 07.38.30.522711000 AM GMT 04-MAR-21 07.38.30.522711000 AM GMT COPY$1_LOG COPY$1_BAD
LOGFILE_TABLE
列には、ロード操作のログを確認するための問合せを実行できる表の名前が表示されます。たとえば、次の問合せでは、ロード操作のログが表示されます:
select * from COPY$21_LOG;
BADFILE_TABLE
列には、ロード中にエラーが発生した行を確認するための問合せを実行できる表の名前が表示されます。たとえば、次の問合せでは、ロード操作で拒否されたレコードが表示されます:
select * from COPY$21_BAD;
ログに示されたエラーと、指定したBADFILE_TABLE
表に示された行に応じて、DBMS_CLOUD.COPY_DATA
で適切なフォーマット・オプションを指定することにより、エラーを修正できます。
LOGFILE_TABLE
表およびBADFILE_TABLE
表は、各ロード操作につき2日間保存されてから、自動的に削除されます。
user_load_operations
表のクリアの詳細は、DELETE_ALL_OPERATIONSプロシージャを参照してください。
親トピック: クラウドのファイルからのデータのロード