Autonomous Database、OCIネイティブSDKの武器にPL/SQLを追加 (2020/10/27)

Autonomous Database、OCIネイティブSDKの武器にPL/SQLを追加 (2020/10/27)

https://blogs.oracle.com/datawarehousing/post/autonomous-database-adds-plsql-to-its-arsenal-of-oci-native-sdks

投稿者:Nilay Panchal | Principal 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 Streamsの管理など、データパイプラインやビジネスロジックの一部を統合できるため、強力です。


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


まだAutonomous Databaseを作成していない場合は、クイックスタートチュートリアルのLab 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関数を呼び出し、必要なパラメータを渡します。Step 3 で作成したリクエストオブジェクトは、ここで渡します。
  5.     レスポンスオブジェクトを設定して、SDK関数の呼び出しからレスポンスを取得します。このレスポンスオブジェクトに、関数呼び出しのステータスとレスポンス情報を問い合わせます。


これで、PL/SQL SDKのDBMS_CLOUD_OCI_OBS_OBJECT_STORAGEパッケージの型と関数を使用することができます。以下のスクリプトでは、オブジェクトストアに "examplebucketfordata"という名前の新しいバケットをトロントリージョンに作成します。


クラウドにデータを保存することに馴染みがない方のために。バケットとは、大小のデータファイルを保存できるコンテナのことです(コンピュータのフォルダにファイルを保存するのと似ています)。クラウドのObject Storageとバケットについて詳しくは、こちらをご覧ください。


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


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;
/


  •     左ペインのメニューをスライドさせ、「アイデンティティ」→「コンパートメント」→「自分のコンパートメント」で、自分のコンパートメントOCIDを見つけることができます。



  •     ネームスペースは、左のペンメニューの「管理」→「テナントの詳細」で確認できます。



  •     あなたのリージョンの識別子は、ここで調べることができます。



以下は出力を簡略化したものですが、REST API 呼び出しで期待されるように、完全なレスポンスヘッダとボディを受け取っていることに注目してください。この情報を使って、ステータスコード、リソースの場所、その他アプリケーションのロジックに必要な情報を調べることができます。



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




まとめ:Oracle Function のフレンドリーな例の再確認


最後に、前回のOracle Functionの例を書き直してみましょう。この例では、REST API 呼び出しに汎用 DBMS_CLOUD.SEND_REQUEST を使用し、「Hello <名前>」と表示するシンプルな Oracle Function を呼び出しています。DBMS_CLOUD_OCI_FNC_FUNCTIONS_INVOKE パッケージを使用して、Oracle Function "fndemo" OCID を提供します。これは Function のコンソールページにある、呼び出しエンドポイントと共に表示されます。


この汎用関数は、他のクラウドプラットフォームの 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;
/



コメント

このブログの人気の投稿

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

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

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