クラウドのファイルからのデータのロード
PL/SQLパッケージDBMS_CLOUDは、クラウドのファイルから専用Exadataインフラストラクチャ上のAutonomous AI Database内に作成された表へのデータのロードをサポートします。
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.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 AI 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 AI Database内のコレクションにロードする方法について学習します。
この例では、行区切りファイルからJSON値をロードし、JSONファイルmyCollection.jsonを使用します。各値(各行)は、Autonomous AI Database上のコレクションに単一のドキュメントとしてロードします。
このようなファイルの例を次に示します。3つの行があり、各行に1つのオブジェクトがあります。これらのオブジェクトはそれぞれ個別のJSONドキュメントとしてロードされます。
{ "name" : "apple", "count": 20 }
{ "name" : "orange", "count": 42 }
{ "name" : "pear", "count": 10 }コレクションへのJSONドキュメントの配列のロード
DBMS_CLOUD.COPY_COLLECTIONプロシージャを使用し、JSONドキュメントの配列をAutonomous AI Database内のコレクションをロードする方法について学習します。
この例では、JSONファイルfruit_array.jsonを使用します。次に、ファイルfruit_array.jsonの内容を示します:
[{"name" : "apple", "count": 20 },
{"name" : "orange", "count": 42 },
{"name" : "pear", "count": 10 }]データ・ロードのモニターとトラブルシューティング
PL/SQLパッケージを使用して実行されたデータ・ロード操作は、表DBMS_CLOUDdba_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プロシージャを参照してください。
拡張されたスカラー値を表すテキストのJSONオブジェクト
ネイティブ・バイナリJSONデータ(OSON形式)は、SQL型に対応し、JSON標準に含まれないスカラー型(日付など)を追加することで、JSON言語を拡張します。Oracle Databaseは、このような非標準値を含むJSONスカラー値を表すテキストJSONオブジェクトの使用もサポートしています。
このような拡張オブジェクトを含むテキストJSONデータからネイティブ・バイナリJSONデータを作成する場合、オプションで、対応する(ネイティブ・バイナリ) JSONスカラー値に置換できます。
拡張オブジェクトの例は、{"$numberDecimal":31}です。これは、非標準タイプの小数のJSONスカラー値を表し、そのように解釈されると、ネイティブ・バイナリ形式の小数に置き換えられます。
たとえば、JSONデータ型コンストラクタJSONを使用する場合、キーワードEXTENDEDを使用すると、テキスト入力で認識された拡張オブジェクトがネイティブ・バイナリJSONの結果では対応するスカラー値に置き換えられます。キーワードEXTENDEDを含めなければ、このような置換は発生しません。テキストの拡張JSONオブジェクトは、ネイティブ・バイナリ形式のJSONオブジェクトにそのまま変換されるだけです。
逆方向では、SQL/JSONファンクションjson_serializeを使用してバイナリJSONデータをテキストのJSONデータ(VARCHAR2、CLOBまたはBLOB)としてシリアライズする場合、キーワードEXTENDEDを使用して、(ネイティブ・バイナリ)JSONスカラー値を対応するテキストの拡張JSONオブジェクトに置き換えることができます。
ノート:
使用するデータベースがOracle Autonomous AI Databaseの場合、PL/SQLプロシージャDBMS_CLOUD.copy_collectionを使用して、Oracle NoSQL Databaseなどの一般的なNoSQLデータベースによって生成されるようなJSONデータのファイルからJSONドキュメント・コレクションを作成できます.
ejsonをプロシージャのtypeパラメータの値として使用すると、入力ファイルで認識された拡張JSONオブジェクトが、結果のネイティブ・バイナリJSONコレクションでは対応するスカラー値に置き換えられます。逆に、ファンクションjson_serializeをキーワードEXTENDEDとともに使用して、結果のテキストJSONデータの拡張JSONオブジェクトにスカラー値を置き換えることができます。
拡張オブジェクトの主なユース・ケースは次のとおりです:
-
交換(インポート/エクスポート):
-
拡張オブジェクトを含む既存の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オブジェクトを特定のスカラー値にマップできます。たとえば、拡張JSONオブジェクトの{"$numberDecimal":"31"}と{"$numberLong:"31"}は、どちらも値31のJSON言語スカラー型numberとして変換され、これらの各JSONスカラーに対して項目メソッドtype()は"number"を返します。
項目メソッドtype()は、対象値のJSON言語スカラー型を(JSON文字列として)報告します。一部のスカラー値は、同じスカラー型であっても内部的に区別できます。これにより、通常、ファンクションjson_serialize (キーワードEXTENDEDを指定)は元の拡張JSONオブジェクトを再構築できます。このようなスカラー値は、その値を実装する様々なSQL型を使用するか、導出元の拡張JSONオブジェクトの種類でタグ付けすることで、内部的に区別されます。
json_serializeが元の拡張JSONオブジェクトを再構築する場合、結果は必ずしも元の結果とテキスト的に同じではありませんが、意味的には常に同等です。たとえば、{"$numberDecimal":"31"}と{"$numberDecimal":31}は、フィールド値の型が異なっていても(文字と数値)、意味的に等しくなります。これらは同じ内部値に変換され、それぞれが$numberDecimal拡張オブジェクトから導出されたものとしてタグが付けられます(同じタグ)。ただし、シリアライズすると、どちらの結果も{"$numberDecimal":31}になります。Oracleでは常に、最も直接関連する型がフィールド値に使用されます。この場合は、スカラー型numberのJSON言語値31です。
表に、使用される様々な型間の対応関係を示します。(1)入力として使用される拡張オブジェクトの型、(2)項目メソッドtype()によって報告される型、(3)内部で使用されるSQL型、(4)ファンクションjson_serializeによる出力として使用される標準のJSON言語型、および(5)キーワードEXTENDEDが指定されている場合のjson_serializeによる拡張オブジェクト出力の型の間でマップします。
表- 拡張JSONオブジェクト型の関係
| 拡張オブジェクトの型(入力) | Oracle JSONスカラー型(type()によるレポート) | SQLスカラー型 | 標準JSONスカラー型(出力) | 拡張オブジェクトの型(出力) |
|---|---|---|---|---|
$numberDouble (値はJSON数値、数値を表す文字列、または"Infinity"、"-Infinity"、"Inf"、"-Inf"、"Nan"のいずれかの文字列脚注1)
|
倍精度浮動小数点 | BINARY_DOUBLE |
数値 |
$numberDouble (値はJSON数値、または"Inf"、"-Inf"、"Nan"のいずれかの文字列脚注2) |
$numberFloat (値は$numberDoubleと同じ) |
浮動小数 | BINARY_FLOAT |
数値 |
$numberFloat (値は$numberDoubleと同じ) |
$numberDoubleと同じ値の$numberDecimal |
数値 | NUMBER |
数値 |
$numberDoubleと同じ値の$numberDecimal |
$numberInt (値は署名付き32ビット整数または数値を表す文字列)
|
数値 | NUMBER |
数値 |
$numberInt (値は$numberDoubleの場合と同じ) |
値がJSON数値または数値を表す文字列の$numberLong
|
数値 | NUMBER |
数値 |
$numberDoubleと同じ値の$numberLong |
|
次のいずれかの値を持つ
値がbase-64文字の文字列の場合、拡張オブジェクトに |
binary | BLOBまたはRAW |
文字列 変換は、SQLファンクション |
次のいずれかが指定されます。
|
$oid (値は24桁の16進文字列)
|
binary | RAW(12) |
文字列 変換は、SQLファンクション |
$rawid (値は24桁の16進文字列)
|
$rawhex (値は偶数の16進文字の文字列)
|
binary | RAW |
文字列 変換は、SQLファンクション |
$binary (値は、=文字で右詰め)
|
$rawid (値は24または32桁の16進文字列)
|
binary | RAW |
文字列 変換は、SQLファンクション |
$rawid |
値がISO 8601の日付文字列の$oracleDate
|
日付 | DATE |
文字列 |
値がISO 8601の日付文字列の$oracleDate
|
$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タイムスタンプ文字列) |
SQLファンクションto_dsintervalに指定されたISO 8601間隔文字列の値を持つ$intervalDaySecond |
daysecondInterval | INTERVAL DAY TO SECOND |
文字列 |
SQLファンクションto_dsintervalに指定されたISO 8601間隔文字列の値を持つ$intervalDaySecond |
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または大小文字のバリアントは使用されません。