クラウドのファイルからのデータのロード
PL/SQLパッケージDBMS_CLOUDは、クラウドのファイルからAutonomous AI 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プロシージャを使用してクラウド・オブジェクト・ストレージ資格証明を格納する方法について学習します。
Execute the DBMS_CLOUD.CREATE_CREDENTIAL procedure using any database tool such as SQL*Plus, SQL Developer, or Database Actions (web based SQL Developer tool). たとえば:
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
-
DBMS_CREDENTIAL.CREATE_CREDENTIALプロシージャを使用して、クラウド・オブジェクト・ストレージ資格証明を格納します。詳細は、「資格証明の作成」を参照してください。</span> -
データを含める表を作成します。たとえば:
CREATE TABLE CHANNELS (channel_id CHAR(1), channel_desc VARCHAR2(20), channel_class VARCHAR2(20) ); / -
DBMS_CLOUD.COPY_DATAプロシージャを使用して、データを表にロードします。たとえば:BEGIN DBMS_CLOUD.COPY_DATA( table_name =>'CHANNELS', credential_name =>'DEF_CRED_NAME', file_uri_list =>'https://swiftobjectstorage.us-phoenix-1.oraclecloud.com/v1/idthydc0kinr/mybucket/channels.txt', format => json_object('delimiter' value ',') ); END; /パラメータは次のとおりです:
-
table_name: ターゲット表の名前です。 -
credential_name: 前のステップで作成された資格証明の名前です。 -
file_uri_list: ロードするソース・ファイルのカンマ区切りリストです。この例では、
file_uri_listは、us-phoenix-1リージョンにあるmybucketバケット内のchannels.txtファイルを指定するOracle Cloud Infrastructure Swift URIです。(idthydc0kinrは、バケットが存在するオブジェクト・ストレージ・ネームスペースです。) サポートされているURIフォーマットの詳細は、クラウド・オブジェクト・ストレージのURIフォーマットを参照してください。 -
format: ソース・ファイルのフォーマットを説明するために指定するオプションを定義します。指定できるフォーマット・オプションの詳細は、フォーマット・パラメータを参照してください。
-
コレクションへの区切りドキュメントの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 }
手順
-
DBMS_CLOUD.CREATE_CREDENTIALプロシージャを使用して、クラウド・オブジェクト・ストレージ資格証明を格納します。詳細は、資格証明の作成を参照してください。 -
プロシージャ
DBMS_CLOUD.COPY_DATAを使用して、データをコレクションにロードしますたとえば:BEGIN DBMS_CLOUD.COPY_COLLECTION( collection_name =>'fruit', credential_name =>'DEF_CRED_NAME', file_uri_list =>'https://objectstorage.us-ashburn-1.oraclecloud.com/n/namespace-string/b/fruit_bucket/o/myCollection.json', format => json_object('recorddelimiter' value '''\n''') ); END; /パラメータは次のとおりです:
-
collection_name: ターゲット・コレクションの名前です。 -
credential_name: 前のステップで作成された資格証明の名前です。 -
file_uri_list: ロードするソース・ファイルのカンマ区切りリストです。この例では、
file_uri_listは、us-phoenix-1リージョンにあるmybucketバケット内のmyCollection.jsonファイルを指定するOracle Cloud Infrastructure Swift URIです。サポートされているURIフォーマットの詳細は、クラウド・オブジェクト・ストレージのURIフォーマットを参照してください。 -
format: ソース・ファイルのフォーマットを説明するために指定するオプションを定義します。フォーマット・オプションcharacterset, compression, ignoreblanklines, jsonpath, maxdocsize, recorddelimiter, rejectlimit, unpackarrayは、JSONデータのロードでサポートされています。これ以外のフォーマットを指定すると、エラーが発生します。指定できるフォーマット・オプションの詳細は、フォーマット・パラメータを参照してください。
-
コレクションへのJSONドキュメントの配列のロード
DBMS_CLOUD.COPY_COLLECTIONプロシージャを使用した、Autonomous AI Database内のコレクションへのJSONドキュメントの配列のロード方法について学習します。
この例では、JSONファイルfruit_array.jsonを使用します。次に、ファイルfruit_array.jsonの内容を示します:
[{"name" : "apple", "count": 20 },
{"name" : "orange", "count": 42 },
{"name" : "pear", "count": 10 }]
手順
-
DBMS_CLOUD.CREATE_CREDENTIALプロシージャを使用して、クラウド・オブジェクト・ストレージ資格証明を格納します。詳細は、資格証明の作成を参照してください。 -
プロシージャ
DBMS_CLOUD.COPY_DATAを使用して、データをコレクションにロードしますたとえば:BEGIN DBMS_CLOUD.COPY_COLLECTION( collection_name => 'fruits', credential_name => 'DEF_CRED_NAME', file_uri_list => 'https://objectstorage.us-ashburn-1.oraclecloud.com/n/namespace-string/b/json/o/fruit_array.json', format => '{"recorddelimiter" : "0x''01''", "unpackarrays" : "TRUE", "maxdocsize" : "10240000"}' ); END; /この例では、ファイル全体を占める単一のJSON値をロードします。そのため、レコード・デリミタを指定する必要はありません。レコード・デリミタがないことを示すために、入力ファイル内に出現しない文字を使用できます。たとえば、値
"0x''01''"は、この文字がJSONテキスト内に直接出現しないため、使用できます。フォーマット値の
unpackarraysパラメータがTRUEに設定されている場合、ドキュメントの配列は、配列全体としてではなく個々のドキュメントとしてロードされます。ただし、配列要素の解凍は単一レベルに制限されます。ドキュメント内にネストされた配列がある場合、これらの配列は解凍されません。パラメータは次のとおりです:
-
collection_name: ターゲット・コレクションの名前です。 -
credential_name: 前のステップで作成された資格証明の名前です。 -
file_uri_list: ロードするソース・ファイルのカンマ区切りリストです。この例では、
file_uri_listは、us-phoenix-1リージョンにあるmybucketバケット内のmyCollection.jsonファイルを指定するOracle Cloud Infrastructure Swift URIです。サポートされているURIフォーマットの詳細は、クラウド・オブジェクト・ストレージのURIフォーマットを参照してください。 -
format: ソース・ファイルのフォーマットを説明するために指定するオプションを定義します。フォーマット・オプションcharacterset, compression, ignoreblanklines, jsonpath, maxdocsize, recorddelimiter, rejectlimit, unpackarrayは、JSONデータのロードでサポートされています。これ以外のフォーマットを指定すると、エラーが発生します。指定できるフォーマット・オプションの詳細は、フォーマット・パラメータを参照してください。
DBMS_CLOUD.COPY_COLLECTIONでフォーマット・オプションunpackarraysを使用してfruit_array.jsonをロードすると、プロシージャによりソース内の配列値が認識されます。そのため、デフォルトのようにデータが単一のドキュメントとしてロードされるのではなく、配列内の各値を単一のドキュメントとしてデータがコレクションfruitsにロードされます。 -
既存の表に対するJSONデータのコピー
DBMS_CLOUD.COPY_DATAを使用して、クラウド内のJSONデータを表にロードします。
この例のソース・ファイルは、JSONデータ・ファイルです。
手順
-
プロシージャ
DBMS_CLOUD.CREATE_CREDENTIALを使用してオブジェクト・ストア資格証明を格納します. たとえば:SET DEFINE OFF BEGIN DBMS_CLOUD.CREATE_CREDENTIAL( credential_name => 'DEF_CRED_NAME', username => 'adb_user@example.com', password => 'password' ); END; /この操作によって、資格証明が暗号化された形式でデータベースに格納されます。資格証明には任意の名前を使用できます。オブジェクト・ストアの資格証明を変更しないかぎり、このステップが必要なのは1回のみです。資格証明を格納した後は、すべてのデータ・ロードで同じ資格証明名を使用できます。
パラメータの詳細は、「CREATE_CREDENTIALプロシージャ」を参照してください。
-
プロシージャ
DBMS_CLOUD.COPY_DATAを使用して、既存の表にJSONデータをロードします、たとえば:
CREATE TABLE WEATHER2 (WEATHER_STATION_ID VARCHAR2(20), WEATHER_STATION_NAME VARCHAR2(50)); / BEGIN DBMS_CLOUD.COPY_DATA( table_name => 'WEATHER2', credential_name => 'DEF_CRED_NAME', file_uri_list => 'https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname/o/jsonfiles*', format => JSON_OBJECT('type' value 'json', 'columnpath' value '["$.WEATHER_STATION_ID", "$.WEATHER_STATION_NAME"]') ); END; /パラメータは次のとおりです:
-
table_name: ターゲット表の名前です。 -
credential_name: 前のステップで作成された資格証明の名前です。 -
file_uri_list: ロードするソース・ファイルのカンマ区切りリストです。URIのファイル名にワイルドカードを使用できます。文字"*"は複数の文字のワイルドカードとして使用でき、文字"?"は1つの文字のワイルドカードとして使用できます。 -
format: JSONデータを含むDBMS_CLOUD.COPY_DATAの場合、typeはjsonです。その他のフォーマット値を指定して、JSONソース・ファイルのフォーマットを記述するオプションを定義します。詳細は、DBMS_CLOUDパッケージ・フォーマット・オプションを参照してください。
この例では、
namespace-stringはOracle Cloud Infrastructureオブジェクト・ストレージ・ネームスペースで、bucketnameはバケット名です。詳細は、オブジェクト・ストレージ・ネームスペースの理解を参照してください。パラメータの詳細は、「COPY_DATAプロシージャ」をご覧ください。
-
データ・ロードのモニターとトラブルシューティング
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日間保存されてから、自動的に削除されます。
dbmscloud-for-objects-and-files.md#GUID-CEC0CA63-B77F-4D64-B70F-1E8476AE3ED6
user_load_operations表のクリアの詳細は、DELETE_ALL_OPERATIONSプロシージャを参照してください。
拡張されたスカラー値を表すテキストのJSONオブジェクト
ネイティブ・バイナリJSONデータ(OSON形式)は、SQL型に対応する、JSON標準に含まれないスカラー型(日付など)を追加することで、JSON言語を拡張します。Oracle Databaseでは、このような非標準の値を含むJSONスカラー値を表すテキストJSONオブジェクトの使用もサポートしています。
When you create native binary JSON data from textual JSON data that contains such extended objects , they can optionally be replaced with corresponding (native binary) JSON scalar values.
拡張オブジェクトの例として、{"$numberDecimal":31}があります。これは、非標準型の小数型のJSONスカラー値を表し、そのように解釈されると、ネイティブ・バイナリ形式の10進数に置き換えられます。
たとえば、JSONデータ型コンストラクタJSONを使用する場合、キーワードEXTENDEDを使用すると、テキストの入力で認識された拡張オブジェクトがネイティブ・バイナリJSONの結果では対応するスカラー値に置き換えられます。キーワードEXTENDEDを含めなければ、このような置換は発生しません。テキストの拡張JSONオブジェクトは、ネイティブ・バイナリ形式のJSONオブジェクトにそのまま変換されるだけです。
逆方向では、SQL/JSONファンクションjson_serializeを使用してバイナリJSONデータをテキストのJSONデータ(VARCHAR2、CLOBまたはBLOB)としてシリアライズする場合、キーワードEXTENDEDを使用して、(ネイティブ・バイナリ)JSONスカラー値を対応するテキストの拡張JSONオブジェクトに置き換えることができます。
Note: If the database you use is an Oracle Autonomous AI Database then you can use PL/SQL procedure DBMS_CLOUD.copy_collection to create a JSON document collection from a file of JSON data such as that produced by common NoSQL databases, including Oracle NoSQL Database.
ejsonをプロシージャのtypeパラメータ値として使用すると、入力ファイルで認識された拡張JSONオブジェクトが、結果のネイティブ・バイナリJSONコレクションでは対応するスカラー値に置き換えられます。もう1つ方向では、ファンクションjson_serializeをキーワードEXTENDEDとともに使用して、結果のテキストのJSONデータで、スカラー値を拡張JSONオブジェクトに置き換えることができます。
拡張オブジェクトの主なユースケースを2つ、次に示します。
-
交換(インポート/エクスポート):
-
拡張オブジェクトを含む既存のJSONデータを(どこかから)取り込みします。
-
データベース外部でなんらかに使用するために、拡張オブジェクトを使用して、ネイティブ・バイナリJSONデータをJSONテキスト・データとしてシリアライズします。
-
-
ネイティブ・バイナリJSONデータの検査: 対応する拡張オブジェクトを参照して、保持しているものを確認します。
交換目的の場合、拡張オブジェクトをネイティブ・バイナリJSONスカラーに変換して、Oracle NoSQL Databaseなど一般的なNoSQLデータベースによって生成されたファイルからJSONデータを取り込むことができます。もう1つの方向では、Oracle固有のスカラーJSON値を対応するテキスト拡張JSONオブジェクトに置き換えて、ネイティブ・バイナリJSONデータをテキスト・データとしてエクスポートできます。
ヒント:検査の例としては、{"dob" : "2000-01-02T00:00:00"}などのオブジェクトを、ネイティブJSONデータをシリアライズした結果として考えてみます。"2000-01-02T00:00:00"は、日付型のネイティブ・バイナリ値をシリアライズした結果でしょうか。それとも、ネイティブ・バイナリ値は単なる文字列でしょうか。json_serializeをキーワードEXTENDEDとともに使用すると、答えがわかります。
拡張オブジェクト・フィールドからスカラー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}は、フィールド値の型(stringとnumber)が異なっておりても意味的に等しいものです。これらは同じ内部値に変換され、それぞれが$numberDecimal拡張オブジェクト(同じタグ)から導出されたものとしてタグ付けされる。ただし、シリアライズすると、どちらの結果も{"$numberDecimal":31}になります。Oracleでは常に、スカラー型数値のフィールド値(この場合はJSON言語値31)に最も直接的に関連する型が使用されます。
次の表に、使用される様々なタイプの対応を示します。(1)入力として使用される拡張オブジェクトの型、(2)項目メソッドtype()によって報告される型、(3)内部で使用されるSQL型、(4)ファンクションjson_serializeによる出力として使用される標準のJSON言語型、および(5)キーワードEXTENDEDが指定されている場合のjson_serializeによる拡張オブジェクト出力の型の間でマップします。
| 拡張オブジェクト型(入力) | Oracle JSONスカラー型(type()によって報告) | SQLスカラー型 | 標準JSONスカラー型(出力) | 拡張オブジェクト型(出力) |
|---|---|---|---|---|
$numberDouble with value a JSON number, a string representing the number, or one of these strings: "Infinity", "-Infinity", "Inf", "-Inf", "Nan"(See Footnote 1) |
倍精度浮動小数点 | BINARY_DOUBLE |
数値 | JSON数値、または"Inf"、"-Inf"、"Nan"のいずれかの文字列を使用した$numberDouble(脚注2を参照) |
$numberDoubleの場合と同じ値を持つ$numberFloat |
浮動小数 | BINARY_FLOAT |
数値 | $numberDoubleの場合と同じ値を持つ$numberFloat |
$numberDoubleの場合と同じ値を持つ$numberDecimal |
数値 | NUMBER |
数値 | $numberDoubleの場合と同じ値を持つ$numberDecimal |
符号付き32ビット整数または数値を表す文字列を持つ$numberInt |
数値 | NUMBER |
数値 | $numberInt ($numberDoubleと同じ値を持つ) |
値がJSON数値または数値を表す文字列の$numberLong |
数値 | NUMBER |
数値 | $numberLong ($numberDoubleと同じ値を持つ) |
値が64文字の文字列の場合は、拡張オブジェクトに |
binary | BLOBまたはRAW |
文字列 変換は、SQLファンクション |
次のいずれかが指定されます。
|
値が24桁の16進文字列値を持つ$oid |
binary | RAW(12) |
文字列 変換は、SQLファンクション |
値が24桁の16進文字列値を持つ$rawid |
値が偶数の16進数文字を含む文字列値を持つ$rawhex |
binary | RAW |
文字列 変換は、SQLファンクション |
$binary (値はbase-64文字列、=文字で右詰め) |
値が24または32桁の16進文字列値を持つ$rawid |
binary | RAW |
文字列 変換は、SQLファンクション |
$rawid |
値がISO 8601の日付文字列の$oracleDate |
日付 | DATE |
文字列 | 値がISO 8601の日付文字列の$oracleDate |
$oracleTimestamp (値はISO 8601タイムスタンプ文字列) |
タイムスタンプ | TIMESTAMP |
文字列 | $oracleTimestamp (値はISO 8601タイムスタンプ文字列) |
$oracleTimestampTZ (値はISO 8601タイムスタンプ文字列で、数値のタイムゾーン・オフセットまたはZを持つ) |
タイムスタンプとタイムゾーン | TIMESTAMP WITH TIME ZONE |
文字列 | $oracleTimestampTZ (値はISO 8601タイムスタンプ文字列で、数値のタイムゾーン・オフセットまたはZを持つ) |
|
タイムスタンプとタイムゾーン | TIMESTAMP WITH TIME ZONE |
文字列 | $oracleTimestampTZ (値はISO 8601タイムスタンプ文字列で、数値のタイムゾーン・オフセットまたはZを持つ) |
SQLファンクションto_dsintervalに指定されたISO 8601間隔文字列の値を持つ$intervalDaySecond |
日数インターバル | 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または大文字と小文字のバリアントはありません。