PL/SQLでのData Studioデータ・ロードAPIの使用 (2024/06/29)
PL/SQLでのData Studioデータ・ロードAPIの使用 (2024/06/29)
https://blogs.oracle.com/datawarehousing/post/data-studio-data-load-apis-plsql
投稿者: William Endress | Autonomous Database Product Management
はじめに
Data Studioデータ・ロード・アプリケーションは、強力で使いやすいデータ・ロード・アプリケーションを提供し、ユーザーはコーディングなしでObject Storageから様々なファイル形式をロードできます。このアプリケーションで使用されるものと同じREST APIが文書化され、アプリケーション開発者が使用できます。REST Data Services APIを使用したデータ・ロード後のこのことについて最後に書きましたが、CURLを使用した簡単な例を提供します。
この投稿では、クラウド・ストレージ・リンクの作成、入力データの調査、データ・ロード・ジョブの作成、およびPL/SQLの進行状況の監視の例を示します。
Data Studioデータ・ロードAPIを使用する利点
Data Studioデータ・ロード・アプリケーションを使用して、データ・ロードを実行するために生成されたSQLを確認したとします。その場合、データ・ロード・ツール、つまりAPIがDBMS_CLOUDの上に階層化されていることがわかります。その後、Data Studio APIがDBMS_CLOUDを上回るメリットについて疑問に思うかもしれません。利点はたくさんあります!以下はほんの少しです:
- Data Studio APIは、オブジェクト・ストア上のファイルを自動的に調査し、DBMS_CLOUD.COPY_DATAおよびCREATE_EXTERNAL_TABLE (フィールド・リスト、列リストおよびフォーマット・パラメータ)への入力を提供します。
- Data Studio APIは、データ・ロード・ジョブをバックグラウンド・プロセスとして自動的に実行するようにスケジュールします。これはステートレスREST APIに必要ですが、バックグラウンドで実行時間が長い操作を実行する機能は、PL/SQLベースのアプリケーションにも非常に役立ちます。
- Data Studioはジョブを自動的にログに記録し、ジョブの進捗を追跡するためのAPIを提供します。
- Data Studio APIを使用すると、後で再利用できるように、名前クラウド・ストア・リンク(クラウド・ストアURIおよび資格証明)を作成できます。
それらはほんの数です。時間が節約され、DBMS_CLOUDへのコールの設定から推測が不要になるため、お気に入りはサーベイ・エンドポイントです。DBMS_CLOUD.COPY_DATAは手作業で行ったことがありません。
PL/SQLを使用したREST APIの実行
REST APIは、Webベースのアプリケーションの基盤として知られていますが、PL/SQLでREST APIをどれほど簡単に使用できるかはわかりません。必要なのは、Webリクエストの作成、レスポンスの受信、およびJSONオブジェクトからのデータの抽出方法を知るためのPL/SQLファンクションのみです。幸いなことに、Oracleは両方を提供します。同僚のNilay Panchal氏は、Autonomous Database内からOracle Function(または任意のクラウドREST API)をレベルアップして呼び出す方法について、自分の投稿でDBMS_CLOUD.SEND_REQUESTの使用について書きました。APEXでかなりの時間を過ごすので、例でAPEX_UTIL.MAKE_WEB_REQUESTを使用します。REST APIを使用する場合、JSON_VALUE、JSON_TABLE、JSON_OBJECTなどのOracle JSON関数の知識が必要です。
APEX_UTIL.MAKE_WEB_REQUESTの使用は、非常にストレート形式です。次の形式を使用します。
DECLARE
v_response CLOB;
BEGIN
v_response := APEX_WEB_SERVICE.MAKE_REST_REQUEST (
p_url => 'endpoint url'
, p_username => 'database username'
, p_password => 'database user password'
, p_body => 'body');
RETURN v_response;
END;
サンプル・スクリプト
データ・ロードの各ステージを実行するPL/SQLスクリプトを作成することは非常に簡単です。次のスクリプト:
- 事前認証済リクエスト(PAR)を使用してクラウド・ストレージ・リンクを作成します。
- サーベイを実行してデータファイルを検査します。
- データ・ロード・ジョブを作成します。
- データ・ロード・ジョブの進捗を取得します。
次のサンプル・スクリプトは、クラウド・ストアの場所を作成し、データ・ロード・ジョブを作成し、ジョブの進行状況を確認します。
クラウド・ストア・リンクの作成
クラウド・ストレージ・リンクは、名前付きクラウド・ストアURIであり、必要に応じて資格証明名です。この例では事前認証済リクエストを使用するため、資格証明は必要ありません。
DECLARE
v_response CLOB;
v_base_url VARCHAR2(1000);
v_database_user VARCHAR2(100);
v_password VARCHAR2(100);
v_url VARCHAR2(1000);
v_body CLOB;
BEGIN
-- The name of your database user (schema) and password.
v_database_user := 'your_user';
v_password := 'your_password';
-- The URL to your Autonomous Database instance. Note: Do not include a / at the end.
v_base_url := 'https://xxxxxx.oraclecloudapps.com';
-- The URL used in the web request (no substitutions required).
v_url := v_base_url || '/ords/' || LOWER(v_database_user) || '/_/db-api/stable/data-tools/cloud-storage-links/';
-- Parameters to the cloud store link (no substitutions required).
v_body :=
'{
"cloud_storage_links":[
{
"storage_link_name":"FUEL_PRICES",
"storage_link_description":"Preauthenicated request to Oracle object store bucket",
"uri":"https://objectstorage.uk-london-1.oraclecloud.com/p/QLkz12KR7fmHrp_REIU4s1pVxoybjv-nyxU1hbPajogTbR8iTeJGsAr556yTMVrw/n/adwc4pm/b/blog_data/o/"
}
]
}';
-- Make the web request to create the cloud storage link.
v_response := APEX_WEB_SERVICE.MAKE_REST_REQUEST(
p_url => v_url
, p_http_method => 'POST'
, p_username => v_database_user
, p_password => v_password
, p_body => v_body);
-- Print the response to the screen.
DBMS_OUTPUT.PUT_LINE (v_response);
END;
/
サーベイ入力データおよびデータ・ロード・ジョブの作成
データ・ロード・ジョブの作成は、次の2つの部分からなるプロセスです。
- 入力データを調査します(フォーマット、列リストおよびフィールド・リストを取得します)。
- データ・ロード・ジョブを作成します。
DECLARE
v_survey CLOB;
v_response CLOB;
v_base_url VARCHAR2(1000);
v_database_user VARCHAR2(100);
v_password VARCHAR2(100);
v_url VARCHAR2(1000);
v_body CLOB;
BEGIN
-- The name of your database user (schema) and password.
v_database_user := 'your_user';
v_password := 'Oracle123456';
-- The URL to your Autonomous Database instance. Note: Do not include a / at the end.
v_base_url := 'https://xxxxxx.oraclecloudapps.com';
-- The URL used in the survey web request (no substitutions required).
v_url := v_base_url || '/ords/' || LOWER(v_database_user) || '/_/db-api/stable/data-tools/surveys/';
-- Create the body to the survey web request. Note that in this example
-- 'd1925/' is a folder within the cloud store bucket.
v_body :=
'{
"data_loads":[
{
"storage_link_name":"FUEL_PRICES",
"objects":[
{
"object_name":"d1925/"
}
],
"table_name":"FUEL_PRICES_TABLE"
}
]
}';
-- Make the survey web request.
v_survey := APEX_WEB_SERVICE.MAKE_REST_REQUEST(
p_url => v_url
, p_http_method => 'POST'
, p_username => v_database_user
, p_password => v_password
, p_body => v_body);
DBMS_OUTPUT.PUT_LINE (JSON_QUERY(v_survey, '$' RETURNING CLOB PRETTY) );
-- The URL used in the create data load job web request.
v_url := v_base_url || '/ords/' || LOWER(v_database_user) || '/_/db-api/stable/data-tools/data-loads/';
-- Make the create load job request. Note the previous survey response is
-- the body to the create data load job request.
v_response := APEX_WEB_SERVICE.MAKE_REST_REQUEST(
p_url => v_url
, p_http_method => 'POST'
, p_username => v_database_user
, p_password => v_password
, p_body => v_survey);
-- Print the response to the screen.
DBMS_OUTPUT.PUT_LINE (JSON_QUERY(v_response, '$' RETURNING CLOB PRETTY) );
END;
/
データ・ロード・ジョブのステータスの確認
データ・ロード・ジョブのステータスを確認します。ジョブ・リクエストの作成レスポンスのdata_load_idに注意してください。
DECLARE
v_response CLOB;
v_base_url VARCHAR2(1000);
v_database_user VARCHAR2(100);
v_password VARCHAR2(100);
v_job_id INT;
v_url VARCHAR2(1000);
BEGIN
-- The name of your database user (schema) and password.
v_database_user := 'your_user';
v_password := 'your_password';
-- The URL to your Autonomous Database instance. Note: Do not include a / at the end.
v_base_url := 'https://xxxxxx.oraclecloudapps.com';
-- Substitute your job id.
v_job_id := 21947;
-- The URL used in the survey web request (no substitutions required).
v_url := v_base_url || '/ords/' || LOWER(v_database_user) || '/_/db-api/stable/data-tools/data-loads/' || v_database_user || ',' || v_job_id || '/progress';
-- Make the progress web request.
v_response := APEX_WEB_SERVICE.MAKE_REST_REQUEST(
p_url => v_url
, p_http_method => 'GET'
, p_username => v_database_user
, p_password => v_password);
-- Print the response to the screen.
DBMS_OUTPUT.PUT_LINE (JSON_QUERY(v_response, '$' RETURNING CLOB PRETTY) );
END;
/
表の問合せ
この仕事は小さくて速く走るだろう。これで、表を問い合せることができます。
SELECT * FROM FUEL_PRICES_TABLE;
APIレスポンスからの選択
WebリクエストはJSONオブジェクトを返します。PL/SQLで作業している場合は、JSONからデータを問い合せたり、抽出する必要があります。プロのヒント: 生成AIは、通常、JSONオブジェクトを使用したOracle JSON関数の優れた例を提供します。「Oracle JSON_TABLEの使用」などのプロンプトを使用して、次のJSONオブジェクトからtable_name、column_name、field_nameを選択します: {ここにオブジェクトを貼り付けます。}
次に例を示します。
サーベイ応答
表としてサーベイ応答から選択します。
SELECT
table_name
, column_name
, field_name
, data_type
, data_length
, data_format
, column_id
FROM
JSON_TABLE ({your survey response}, '$.data_loads[*]'
COLUMNS (
table_name VARCHAR2 ( 100 ) PATH '$.table_name'
, NESTED PATH '$.columns[*]'
COLUMNS (
column_name VARCHAR2 ( 500 ) PATH '$.column_name'
, field_name VARCHAR2 ( 500 ) PATH '$.field_name'
, data_type VARCHAR2 ( 500 ) PATH '$.data_type'
, data_length NUMBER PATH '$.data_length'
, data_format VARCHAR2 ( 500 ) PATH '$.data_format'
, column_id NUMBER PATH '$.column_id'
)
)
)
jt;
調査応答から値ignoremissingcolumnsを抽出します。
JSON_VALUE(json_column, '$.data_loads[0].format.ignoremissingcolumns' RETURNING BOOLEAN)
進捗応答
表として進捗応答から選択します。
SELECT
owner
, data_load_job_id
, table_name
, rows_loaded
, rows_rejected
, rows_total
, estimated_total_rows
, percentage_completed
, status
, time_start
, time_completion
, exception_details
, last_event VARCHAR2
, time_of_last_event
FROM
JSON_TABLE ( '{your progess response}', '$.items[*]'
COLUMNS (
owner VARCHAR2 ( 20 ) PATH '$.owner'
, data_load_job_id NUMBER PATH '$.data_load_job_id'
, table_name VARCHAR2 ( 30 ) PATH '$.table_name'
, rows_loaded NUMBER PATH '$.rows_loaded'
, rows_rejected NUMBER PATH '$.rows_rejected'
, rows_total NUMBER PATH '$.rows_total'
, estimated_total_rows VARCHAR2 ( 10 ) PATH '$.estimated_total_rows'
, percentage_completed NUMBER PATH '$.percentage_completed'
, status VARCHAR2 ( 20 ) PATH '$.status'
, time_start TIMESTAMP PATH '$.time_start'
, time_completion TIMESTAMP PATH '$.time_completion'
, exception_details VARCHAR2 ( 100 ) PATH '$.exception_details'
, last_event VARCHAR2 ( 20 ) PATH '$.last_event'
, time_of_last_event TIMESTAMP PATH '$.time_of_last_event'
)
)
jt;
進捗応答から単一値を抽出するエクスプレス。
JSON_VALUE({your progess response},'$.items[0].percentage_completed')
まとめ
Oracle Autonomous Data Studioのデータ・ロードAPIを使用すると、データ・ロード・ジョブの定義と実行が非常に簡単になります。APIは、データベース提供のパッケージを使用してPL/SQL内からWebリクエストとして実行できるため、これらの重要なAPIを利用するスクリプトおよびアプリケーションを構築できます。
コメント
コメントを投稿