[AutonomousDB]Autonomous Databaseは、PL/SQLをOCIネイティブSDKに追加 (2020/10/26)

 Autonomous Databaseは、PL/SQLをOCIネイティブSDKに追加 (2020/10/26)

https://blogs.oracle.com/datawarehousing/autonomous-database-adds-plsql-oci-native-sdk
投稿者:Nilay Panchal | Senior Product Manager


今年の初め、私はAutonomous Database on Shared infrastructure (ADB-S)の新機能を紹介しました。
これにより、サーバを立ち上げることなく、データベース内でスクリプトを実行するだけで、
ほとんどのクラウドREST APIを呼び出すことが可能になりました。
私たちは今、さらに一歩進んで、以前の一般的なDBMS_CLOUD.SEND_REQUESTプロシージャの上に、使い慣れたネイティブのOCI PL/SQL SDKを構築しました。
これにより、Oracle Cloud Infrastructure(OCI)用のネイティブSDKの長いリストにPL/SQLが追加されました。

このSDKを使用すると、ユーザーはデータベース・スクリプトのように、
任意のOCI REST APIを呼び出すPL/SQLプロシージャを呼び出すことができます。
これは、Object Storageデータの作成と管理仮想マシンAutonomous Databaseのスケールアップ、
サーバーレスのOracle Functionsの呼び出し、Data Streamの管理など、データ・パイプラインとビジネス・ロジックの一部を統合することができるので、強力です。

SQL Developer Web ワークシートに飛び込んで、これを実行に移すとどのようになるかを見てみましょう。
以下の例では、データを保持できるオブジェクトストアにバケットを作成し、後でOracle Functionを呼び出します。

まだAutonomous Databaseを作成していない場合は、クイックスタートチュートリアルのラボ1に従ってください。ほんの数分でできます。

ネイティブOCIクレデンシャルの作成


OCI REST APIへの認可された安全な呼び出しのためには、まず、公開鍵と秘密鍵を使用してネイティブのOCIクレデンシャルを作成する必要があります。
クレデンシャルの作成に慣れていない場合は、私の同僚であるCanのセキュアアクセスOCIクレデンシャル作成の簡単なガイドに従ってください。
ここでは、OCIネイティブクレデンシャル「SDK_CRED」を作成しています。

begin
DBMS_CLOUD.CREATE_CREDENTIAL (
credential_name => 'SDK_CRED',
user_ocid => 'ocid1.user.oc1....',
tenancy_ocid => 'ocid1.tenancy.oc1....',
private_key => 'MIIE.....',
fingerprint => 'f2:db:d9:18:a4:aa:fc:83:f4:f6:6c:39:96:16:aa:27'
);
end;
/


OCI Object Storage用の関連する DBMS_CLOUD_OCI_* PL/SQL SDK パッケージを呼び出します。

OCI REST API上で本SDKを使用する場合、コードブロックの一般的なガイドラインは以下の通りです。

  1. REST API呼び出しを実行したいOCIリソースに関連する名前のついたSDKパッケージを識別します。
  2. パッケージで定義されているレスポンスオブジェクトと、レスポンスオブジェクトの型定義で指定されている型を持つ対応するレスポンスボディオブジェクトを宣言します。
  3. リクエストオブジェクトとそのパラメータを宣言し、設定します。もし、意図したSDK関数の呼び出しと一緒に送信する必要がある場合は、(以下の例では "bucketdetails "を設定する必要があります)
  4. 実行したいアクションに関連するSDK関数を呼び出し、必要なパラメータの値を渡します。ステップ3で作成したリクエストオブジェクトをここに渡します。
  5. レスポンスオブジェクトを設定して、SDK関数の呼び出しからレスポンスを取得します。このレスポンス オブジェクトに、関数呼び出しからのステータスとレスポンス情報を問い合わせます。

これで、PL/SQL SDKからDBMS_CLUD_OOCI_OBS_OBJECT_STORAGEパッケージの型と関数を使用して進めます。
以下のスクリプトでは、トロントリージョンの「examplebucketfordata」という名前のオブジェクトストアに新しいバケットを作成します。

クラウド上にデータを保存することに慣れていない方はご注意ください。
バケットとは、小さなデータファイルや大きなデータファイルを保存できるコンテナのことです(ファイルを保存するコンピュータのフォルダに似ています)。
クラウドオブジェクトストレージとバケットについての詳細はこちらをご覧ください。

必要なリソースの詳細がどこにあるかについては、以下の画面を参照してください。

set serveroutput on
declare
l_type_status PLS_INTEGER;
resp_body dbms_cloud_oci_obs_object_storage_bucket_t;
response dbms_cloud_oci_obs_object_storage_create_bucket_response_t;
bucket_details dbms_cloud_oci_obs_object_storage_create_bucket_details_t;
l_json_obj json_object_t;
l_keys json_key_list;
begin
bucket_details := dbms_cloud_oci_obs_object_storage_create_bucket_details_t();
bucket_details.name := 'examplebucketfordata';
bucket_details.compartment_id := 'ocid1.compartment.oc1...';
--Note the use of the native SDK function create_bucket
response := dbms_cloud_oci_obs_object_storage.create_bucket(
namespace_name => 'adwc4pm',
opc_client_request_id => 'xxxxxxxxx',
create_bucket_details => bucket_details,
credential_name => 'SDK_CRED',
region => 'ca-toronto-1');
resp_body := response.response_body;

-- Response Headers
dbms_output.put_line('Headers: ' || CHR(10) ||'------------');
l_json_obj := response.headers;
l_keys := l_json_obj.get_keys;
for i IN 1..l_keys.count loop
dbms_output.put_line(l_keys(i)||':'||l_json_obj.get(l_keys(i)).to_string);
end loop;

-- Response status code
dbms_output.put_line('Status Code: ' || CHR(10) || '------------' || CHR(10) || response.status_code);
dbms_output.put_line(CHR(10));

end;
/


  • 左ペインメニューをスライドさせ、Identity -> Compartments -> Your compartment を選択すると、自分のコンパートメントのOCIDを見つけることができます。

  • あなたのネームスペースは、左のペンメニューの「管理」→「テナントの詳細」から見つけることができます。



以下の出力を簡略化しましたが、REST API コールで期待されているように、完全なレスポンスヘッダと本文を受信していることに注意してください。


このスクリプトを実行して成功応答コード(200)を取得すると、オブジェクトストアに新しく作成されたバケットができました。
これで、DBMS_CLOUD パッケージを使って同様のスクリプトを書き、データをアップロードしたり、バケット内のファイルを管理したりすることができるようになりました。


親しみやすいOracle Functionの例


以前 Oracle Functionsの例として、REST APIコールに汎用DBMS_CLOUD.SEND_REQUESTを使用し、"Hello <名前>"を表示するシンプルなOracle Functionsを呼び出すようにしていました。
DBMS_CLUD_OCI_FNC_FUNCTIONS_INVOKE パッケージを使用して、Oracle Functionsの "fndemo" OCID を提供します。

汎用関数は、他のクラウドプラットフォームのREST APIを呼び出すのに十分に使用できますが、
新しいSDKはパラメータとレスポンスにネイティブのPL/SQLオブジェクトを使用し、コードの品質を向上させ、エラーのマージンを減らしていることに注目してください。
これは、Autonomous の世界で物事がよりシンプルになる方向に向かって常に進化していることを示す素晴らしい例です!

declare
resp_body blob;
response dbms_cloud_oci_fnc_functions_invoke_invoke_function_response_t;
l_json_obj json_object_t;
l_keys json_key_list;
begin
-- Note the use of the native SDK function invoke_function
response := dbms_cloud_oci_fnc_functions_invoke.invoke_function(
function_id => 'ocid1.tenancy.oc2...',
invoke_function_body => UTL_RAW.cast_to_raw('Nilay'),
credential_name => 'SDK_CRED',
region => 'ca-toronto-1');

resp_body := response.response_body;

-- Response status code
dbms_output.put_line('Status Code: ' || CHR(10) || '------------' || CHR(10) || response.status_code);
dbms_output.put_line(CHR(10));

end;
/


Like what I write? Follow me on the Twitter! 🐦

コメント

このブログの人気の投稿

Oracle RACによるメンテナンスのためのドレインとアプリケーション・コンティニュイティの仕組み (2023/11/01)

Oracle Cloud Infrastructure Secure Desktopsを発表: デスクトップ仮想化のためのOracleのクラウドネイティブ・サービス (2023/06/28)

新しいOracle Container Engine for Kubernetesの機能強化により、大規模なKubernetesがさらに簡単になりました (2023/03/20)