2021年4月6日火曜日

APEXからオブジェクト・ストレージをPL/SQL SDKで操作する(2) - バケットの操作

これから、バケットの作成、削除、一覧表示の機能を実装します。

バケットの一覧を取得するパイプライン表関数list_bucketsを定義します。コードは以下になります。

実行にはSQLワークショップのSQLスクリプトを使用します。

メニューのSQLワークショップよりSQLスクリプトを実行します。


登録済みのSQLスクリプトの一覧画面より、作成をクリックします。


スクリプト名list_bucketsと入力し、本文PL/SQLコードを貼り付けて、実行をクリックします。


即時実行をクリックします。


初回実行時は、最初の2行はエラーになります。残りの3行が成功していれば、パイプライン表関数list_bucketsが作成され利用可能になっています。


これからバケットの一覧、作成、更新、削除を行うページを作成します。

アプリケーション・ビルダーから作成中のアプリケーションを開き、ページの作成を実行します。


対話モード・レポートをクリックします。


ページ定義名前バケット一覧とします。フォーム・ページを含めるONに変更し、フォーム・ページ名バケット操作とします。フォーム・ページ・モードとしてモーダル・ダイアログを選択します。

データ・ソースソース・タイプSQL問合せを選択し、以下のSELECT文を記述します。
select * from list_buckets
(
    p_namespace_name => :G_NAMESPACE_NAME
    , p_compartment_id => :G_COMPARTMENT_ID
    , p_region => :G_REGION
    , p_credential_name => :G_CREDENTIAL_NAME
)
ナビゲーションブレッドクラムの使用ナビゲーションの使用はともにONにします。

以上を設定し、へ進みます。


主キー列1としてID(Varchar2)を選択し、ページの作成を実行します。


レポートとフォームのページが作成されます。レポートのページを実行してみます。


レポートのページが開くことを確認します。


バケットが一覧されるようになったので、続いてバケットの作成/更新/削除を行うためにフォームのページを変更します。

バケット操作のページをページ・デザイナで開き、左ペインでプロセス・ビューを表示します。フォームの処理を行うプロセス - プロセス・フォームバケット操作を選択し、設定を変更します。

ターゲット・タイプをRegion SourceからPL/SQL Codeに変更し、以下のPL/SQLコードを挿入/更新/削除するPL/SQLコードに記述します。失われた更新の防止OFF行のロックNoに変更します。



入力を容易にするため、ネームスペース名とコンパートメントIDについては、置換文字列がデフォルトになるように設定します。

ページ・アイテムP3_NAMESPACEを選択し、デフォルトタイプアイテムアイテムとしてG_NAMESPACE_NAMEを入力します。


同様にページ・アイテムP3_COMPARTMENT_IDデフォルトG_COMPARTMENT_IDとします。


実装している操作は、実質的にはバケットの作成と削除です。更新はコード上はありますが、動作の確認ができるような処理は実装していません。

バケットの作成をしてみます。入力するのはNameだけです。ここではtestと入力しています。バケットの作成には不要なページ・アイテムが表示されていますが、対処は省略します。サーバー側の条件などを設定し、非表示するのが望ましい対応でしょう。

作成をクリックします。


バケットが作成されたことを確認できます。


編集アイコンをクリックします。作成したバケットの削除を実行します。


この削除処理を実行しますか。と確認を求められるのでOKをクリックします。


バケットが削除されました。


バケットに日本語を入力するとエラーが発生しますが、これは元々バケット名として使用可能な文字に制限があるためです。OCIのコンソールから日本語のバケットを作ろうとしても同様にエラーになります。ですので、PL/SQL SDKの問題ではありません。


オブジェクトを操作するためのページを作成するため、バケットを作成しておきます。先ほど削除しましたが、再度testというバケットを作成しておきましょう。

バケットの操作については完了しました。

続く

2021年4月5日月曜日

APEXからオブジェクト・ストレージをPL/SQL SDKで操作する(1) - 準備

 以前に書いた記事はAPEXからAPEX_WEB_SERVICEパッケージを使ってオブジェクト・ストレージを操作しました。同じアプリをPL/SQL SDKを使って実装してみようと思います。

以前の記事は英語の記事を元にしていました。その記事の著者Adrian PngがManipulating the Oracle Cloud with PL/SQLとして、PL/SQL SDKを使用するための準備を解説しています。彼が以前に行ったRESTサービスを呼び出す実装は色々と大変だったけど、PL/SQL SDKを使うことにより、低レベルのデータ変換を行うコーディングが不要になり、情報の取り出しも系統だって行えるようになったと言っています。

使用するオブジェクト・ストレージのPL/SQL SDKのドキュメントはこちらです。

元の記事から1年以上経っているので、以前の記事での記載にかかわらず、実施する作業はできるだけ作業ログとして残そうと思います。とはいえ、Autonomous Databaseの作成とOracle APEXのワークスペースの作成は、今回は準備済みとして省略します。

最初にクリデンシャルの登録から行います。

APIユーザーの作成は、以下の記事通りに実施します。

APEXからOCIオブジェクト・ストレージを操作する(1) - APIユーザーの作成

今回はAPEXアプリケーションからバケットも操作するため、ポリシーをreadからmanageにに変更します。

Allow group APEXObjectManagers to manage buckets in compartment APEX


クリデンシャルの作成



作成済みのAutonomous Databaseのデータベース・アクションに、管理者ユーザーADMINで接続します。

SQLの実行画面を開き、Oracle APEXのワークスペース・スキーマにDBMS_CLOUDパッケージの実行権限を与えます。 

grant execute on dbms_cloud to <APEXワークスペース・スキーマ>;

Oracle APEX 22.1以降でAutonomous Database上にワークスペースを作成している場合は、ワークスペース・スキーマ名はワークスペース名にWKSP_が接頭辞として追加されます。

ワークスペース名がAPEXDEVであれば、以下のようになります。 

grant execute on dbms_cloud to wksp_apexdev;



APEXのワークスペースからDBMS_CLOUDパッケージの実行が可能になりました。続いて、APEXのワークスペースにサインインし、SQLワークショップSQLコマンドを開いて、DBMS_CLOUD.CREATE_CREDENTIALプロシージャを実行します。
begin
    dbms_cloud.create_credential(
        credential_name => 'MY_OCI_CRED'
        , user_ocid => 'ocid1.user.oc1..aaaaaaaa*********************************************'
        , tenancy_ocid => 'ocid1.tenancy.oc1..aaaaaaaa**************************************************'
        , private_key => 'MIIE********************************************************************='
        , fingerprint => '**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**'
    );
end;
/
credential_nameは作成されるクリデンシャルの名前で、任意の名前を設定することが可能です。今回はMY_OCI_CREDとします。user_ocidはAPIキーを登録したとき表示されたuser=の値を指定します。tenancy_ocidtenancy=の値です。fingerprintfingerprint=の値です。private_keyはダウンロードした秘密キーのファイルに含まれている-----BEGIN PRIVATE KEY-----から-----END PRIVATE KEY-----の間に含まれているデータを1行にして指定します。BEGINとENDを示す行は含みません。

今回はtrコマンドが使えたので、以下の引数を与えてLFとCRを除去し、コピペしました。

tr -d '\n\r' < apex_oci_api_key.pem

% tr -d '\n\r' < apex_oci_api_key.pem  

-----BEGIN PRIVATE KEY-----MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCu4Lv9Uv0zfkwX6zLJoWc3NTE*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************+ZW7JL3zKKyJBx+GAABlK4E6cMNuoG7sQY6EXtvh6jqRM1aBbzJSmLNDn3R9nvIFy3+OmQdBJrTCVoaFrtGresIOuQchho=-----END PRIVATE KEY-----

%



登録されたクリデンシャルを、ビューUSER_CREDENTIALSを検索して確認します。

select * from user_credentials

検索結果に作成したクリデンシャルが含まれていれば、クリデンシャルの登録はできています。



オブジェクト・ストレージのネームスペースの取得



今までの作業が正しく行われたか確認するため、PL/SQL SDKを使用してオブジェクト・ストレージのネームスペースを取得します。

SQL Developer Webに管理者ユーザーADMINで接続し、必要な権限をAPEXのワークスペース・スキーマに与えます。SQLの画面を開きます。 

grant execute on dbms_cloud_oci_obs_object_storage to WKSP_<APEXワークスペース・スキーマ名>; 
grant execute on dbms_cloud_oci_obs_object_storage_get_namespace_response_t to WKSP_<APEXワークスペース・スキーマ名>;

APEXのワークスペース名がAPEXDEVの場合での実行画面は以下になります。



PL/SQL SDKを呼び出す権限が与えられたので、APEXに移ります。

オブジェクト・ストレージのネームスペースを取得するスクリプトは以下になります。
declare
  response dbms_cloud_oci_obs_object_storage_get_namespace_response_t;
begin
   response := dbms_cloud_oci_obs_object_storage.get_namespace(
       compartment_id => null
       , region => 'リージョン名'
       , credential_name => '作成したクリデンシャル名'
   );
   dbms_output.put_line('Status Code: ' || response.status_code);
   dbms_output.put_line(response.response_body);
end;
リージョン名がus-ashburn-1(北米リージョン)、作成したクリデンシャル名がMY_OCI_CREDの場合の実行例は以下になります。


ネームスペースはオブジェクト・ストレージを操作する際に指定するので、結果はメモしておきましょう。


APEXアプリケーションの作成


アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。名前オブジェクト・ストレージ操作とします。

アプリケーションの作成を実行します。


アプリケーションが作成された後、アプリケーション定義に置換文字列として以下の4つを作成します。

前回の記事通りに作業を行っている場合、対象とするコンパートメントAPEXなので、そのOCID、クリデンシャル名はMY_OCI_CRED、ネームスペース名はDBMS_CLOUD_OCI_OBS_OBJECT_STORAGE.GET_NAMESPACE()を実行して取得したネームスペース名を指定します。リージョン名は北米アッシュバーン・リージョンであれば、us-ashburn-1です。
  • G_COMPARTMENT_ID - コンパートメントのOCID
  • G_CREDENTIAL_NAME - クリデンシャル名
  • G_NAMESPACE_NAME - ネームスペース名
  • G_REGION - リージョン名

これからページの作成を始めますが、その前にPL/SQL SDKをAPEXのワークスペースから呼び出せるように権限を割り与えます。

SQL Developer Webに管理者ユーザーADMINで接続し、以下のスクリプトを実行します。apexdevの部分は、使用中のAPEXのワークスペース名に置き換えてください。
grant execute on DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_LIST_BUCKETS_RESPONSE_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_CREATE_BUCKET_RESPONSE_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_UPDATE_BUCKET_RESPONSE_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_DELETE_BUCKET_RESPONSE_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_LIST_OBJECTS_RESPONSE_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_PUT_OBJECT_RESPONSE_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_RENAME_OBJECT_RESPONSE_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_DELETE_OBJECT_RESPONSE_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_GET_OBJECT_RESPONSE_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBJECT_STORAGE_BUCKET_SUMMARY_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBJECT_STORAGE_CREATE_BUCKET_DETAILS_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBJECT_STORAGE_UPDATE_BUCKET_DETAILS_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBJECT_STORAGE_OBJECT_SUMMARY_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBJECT_STORAGE_RENAME_OBJECT_DETAILS_T to wksp_apexdev;


権限の割り当てを行ったら、Oracle APEXに戻ります。

次の記事からオブジェクト・ストレージを操作する機能を実装していきます。

続く

2021年4月1日木曜日

PL/SQL SDKのクリデンシャルを操作するアプリケーションの作成

 OCIの操作をPL/SQL SDKを使って行うアプリケーションを作り始めたのですが、DBMS_CLOUD.CREATE_CREDENTIALを呼び出してクリデンシャルを登録するのが思いのほか面倒でした。

エラーが発生したときに登録手順のミスなのか、その他に問題があるのか、色々と切り分けをするために条件の違うクリデンシャルを多数作ったり、削除と再作成を簡単に繰り返せるよう、アプリケーションを作ることにしました。

以下から、その作業ログを記述します。

最初にAPEXのワークスペース・スキーマに以下の権限を与えます。今のところPL/SQL SDKが使えるのはAutonomous Databaseのみ(もしかしたらDBCSも使えるかも - 未確認)だったはずなので、SQL Developer WebにADMINで接続してSQLを実行するのが早いでしょう。

grant execute on dbms_cloud to APEXワークスペース・スキーマ;
grant execute on dbms_cloud_oci_obs_object_storage to APEXワークスペース・スキーマ;
grant execute on dbms_cloud_oci_obs_object_storage_get_namespace_response_t to APEXワークスペース・スキーマ;
APEXのワークスペース・スキーマがAPEXDEVである場合の実行例は以下になります。


APEXのアプリケーション・ビルダーにサインインし、空のアプケーションを作成します。名前は任意ですが、今回はクリデンシャル管理としました。今のところPL/SQL SDKはNLS_LANGUAGEがAmerican以外では正常に動作しないようなので、言語英語(en)を選択します。以上の設定で、アプリケーションの作成を行います。


*) エラーについてはMOS NoteのList Compartments Through DBMS_CLOUD.SEND_REQUEST With HTTP GET Method Failed With Error ORA-20401: Authorization failed (Doc ID 2680726.1)に該当している模様です。

アプリケーションが作成されたら、ホーム・ページを開いて、登録済みのクリデンシャルをリストする対話モード・レポートを追加します。

Content Body以下でリージョンの作成を行い、新規に作成されたリージョンの識別タイトル登録済みクリデンシャルと入力し、タイプとして対話モード・レポートを選択します。ソース位置ローカル・データベースタイプSQL問合せを選択し、SQL問合せとして、以下を指定します。

select * from user_credentials


作成したページを実行してみます。すでに登録済みのクリデンシャルがあれば、対話モード・レポートに表示されます。


次にフォームのページを作成します。ページ・デザイナに戻り、作成メニューからページを実行します。


ページ・タイプコンポーネントを選択し、その中のフォームをクリックします。


フォームをクリックします。


ページ名クリデンシャルとします。ページ・モードモーダル・ダイアログを選択します。ページ番号はあとで参照するのでであることを確認し、そうでなければ2に変更します。に進みます。


ページ・タイプはモーダル・ダイアログなので、左メニューにナビゲーションとして現れる必要はありません。ナビゲーションのプリファレンスこのページとナビゲーション・メニュー・エントリを関連付けないを選択し、に進みます。


データ・ソースとしてローカル・データベースを選択し、ソース・タイプSQL問合せとします。SQL SELECT文を入力として、クリデンシャルの登録時に引数となる列の検索に限定したSELECT文を指定します。これ以外の引数は、フォームの作成後にページ・アイテムとして追加します。に進みます。

select credential_name, username from user_credentials


主キー列としてCREDENTIAL_NAME(Varchar2)を選択し、作成を実行します。


以上で、クリデンシャルの登録と削除を行うフォームが作成されました。クリデンシャルの更新を行うAPIはありません。ですので、このフォームの実行可能な操作から行の更新を除きます。フォーム・リージョンのAttributesを開き、チェックを外します。


ファンクションDBMS_CLOUD.CREATE_CREDENTIALの引数には、credential_name、user_ocid、tenancy_ocid、private_key、fingerprintがあります。この内、credential_nameとuser_ocidはそれぞれP2_CREDENTIAL_NAME、P2_USERNAMEとして、値の受け皿となるページ・アイテムが作成されています。それ以外のtenancy_ocid、private_key、fingerprintを指定するためのページ・アイテムを作成します。

それぞれ、P2_TENANCY、P2_PRIVATE_KEY、P2_FINGERPRINTとします。

最初にページ・アイテムP2_TENANCYを作成します。リージョンでページ・アイテムの作成を実行し、識別名前P2_TENANCYタイプテキスト・フィールドを選択します。ラベルTenancy OCIDを設定します。ソースセッション・ステートの保持リクエストごと(メモリーのみ)を選択します。できるだけ隠しておきたい値はセッション・ステート(つまりデータベース)に保存すべきではないし、保存する場合でも、セッション・ステートに暗号化された値を保存ONにすべきです。

次にページ・アイテムP2_FINGERPRINTを作成します。設定内容はP2_TENANCYと同じなので、P2_TENANCY上でコンテキスト・メニューを表示し、重複を実行します。作成されたページ・アイテムP2_TENANCY_1の名前P2_FINGERPRINTラベルFingerprintに変更します。


秘密鍵を入力するページ・アイテムP2_PRIVATE_KEYを作成します。リージョンでページ・アイテムの作成を実行し、識別名前P2_PRIVATE_KEY、複数行の入力になるため、タイプテキスト領域を選択します。ラベルPrivate Keyを設定します。ソースセッション・ステートの保持リクエストごと(メモリーのみ)を選択します。


また、すでに作成されているページ・アイテムも調整します。

ページ・アイテムP2_CREDENTIAL_NAMEは主キー列として定義されているため、タイプが非表示になっています。これを入力が可能なテキスト・フィールドに変更し、ラベルCredential Nameを指定します。


さらに削除時にクリデンシャル名が不用意に変更されないよう、読取り専用の設定を行います。タイプアイテムはNULLではないを選択し、アイテムP2_CREDENTIAL_NAMEを指定します。これでフォームを開いた時点で指定されているクリデンシャル名は、変更できなくなります。


ページ・アイテムP2_USERNAMEは、タイプテキスト・フィールドに変更し、ラベルをより適切なUser OCIDとします。


以上でクリデンシャルの登録に必要な引数を保持するページ・アイテムが作成されました。

これらのページ・アイテムを受け取って、実際にクリデンシャルの作成と削除を行うプロセスの設定を行います。リージョン・ソースはビューUSER_CREDENTIALSを参照していて、これは更新できません。そのため、フォームを処理するプロセスを選択し、設定ターゲット・タイプPL/SQL Codeに変更します。挿入/更新/削除するPL/SQLコードとして以下を記述します。秘密鍵を1行にする部分以外は、受け取ったページ・アイテムを引数としてプロシージャを呼び出しているだけの、簡単な処理です。
declare
    l_private_key varchar2(4000);
    l_end integer;
begin
    case
    when :APEX$ROW_STATUS = 'C' then
        -- 以下より、秘密鍵を一行にする。
        l_private_key := :P2_PRIVATE_KEY;
        -- MIIより前の文字を削除する。
        l_private_key := substr(l_private_key, instr(l_private_key, 'MII'));
        -- '-----END'以降の文字を削除する。見つからない場合は変更なし。
        l_end := instr(l_private_key, '-----END');
        if l_end > 0 then
            l_private_key := substr(l_private_key, 1, (l_end-1));
        end if;
        -- 文字列から CR(13) と LF(10) を取り除く。
        l_private_key := replace(l_private_key, CHR(10));
        l_private_key := replace(l_private_key, CHR(13));
        -- クリデンシャルを登録する。
        dbms_cloud.create_credential(
            credential_name => :P2_CREDENTIAL_NAME
            , user_ocid     => :P2_USERNAME
            , tenancy_ocid  => :P2_TENANCY
            , private_key   => :P2_PRIVATE_KEY
            , fingerprint   => :P2_FINGERPRINT
        );
    when :APEX$ROW_STATUS = 'D' then
        -- クリデンシャルを削除する。
        dbms_cloud.drop_credential(
            credential_name => :P2_CREDENTIAL_NAME
        );
    end case;
end;
その他、失われた更新の防止OFF行のロックOFFとします。


以上でクリデンシャルの作成と削除を行うフォームのページが完成しました。

対話モード・レポートから、作成したフォームを呼び出すリンクを追加します。 

対話モード・レポートのページを開き、登録済みクリデンシャルのリージョンでボタンの作成を実行します。識別ボタン名B_CREATEとし、ラベル作成とします。レイアウトボタン位置対話モード・レポートの検索バーの右とします。外観ホットONにします。動作アクションとしてこのアプリケーションのページにリダイレクトを選択します。


ターゲットタイプこのアプリケーションのページページはフォームのページであるを指定します。キャッシュのクリアにもを設定し、OKをクリックしターゲットの設定を完了します。


クリデンシャルの削除を行うため、対話モード・レポートにリンク列を追加します。Attributesを開き、リンク列としてカスタム・ターゲットへのリンクを選択します。 趣味の問題なので変更しなくても良いのですが、リンク・アイコンを写実的な鉛筆アイコンから、フラットなアイコンへ変更するため、<span class="fa fa-edit"></span>に変更しています。


ターゲットは作成と同様に、タイプこのアプリケーションのページページはフォームのページ番号のを指定します。アイテムの設定として、名前P2_CREDENTIAL_NAMEに値#CREDENTIAL_NAME#を渡すようにします。CREDENTIAL_NAMEが主キーの扱いなので、それ以外の値はフォームのリージョン・ソースから取得されます。キャッシュのクリアとしてを設定し、OKをクリックします。


以上で、登録されているクリデンシャルの一覧表示、クリデンシャルの新規作成および削除は実行できるようになりました。ページの保存して、アプリケーションを実行して確認します。

作成をクリックします。


フォームにCredential NameUser OCIDTenancy OCIDFingerprintPrivate Keyを入力し、Createをクリックします。


ここで設定する情報は秘密鍵を除いて、OCIのコンソールのアイデンティティ/ユーザー/ユーザーの詳細/APIキー構成ファイルの表示から参照することができます。


構成ファイルの表示を行うと、構成ファイルがプレビューされます。user、tenancy、fingerprintの情報を参照できます。


さて、フォームを閉じてレポートに戻っても、登録したクリデンシャルがリストされません。ページをリロードすると表示されます。これはレポートとフォームをそれぞれ独立で作成したときには、ページ作成ウィザードで同時に作成される場合とは異なり、フォームが閉じられたときにレポートをリフレッシュする動的アクションが作成されないためです。


レポートをリフレッシュする動的アクションを追加します。

対話モード・レポートのページをページ・デザイナで開き、左ペインで動的アクション・ビューを表示させます。ダイアログのクローズ上でコンテキスト・メニューを表示させ、動的アクションの作成を実行します。


作成した動的アクションの名前クリデンシャルの編集とし、タイミングイベントダイアログのクローズ選択タイプリージョンリージョンとして登録済みクリデンシャルを指定します。


Trueアクションを選択し、アクションリフレッシュ(最初からリフレッシュで作成されているはずです)、影響を受ける要素選択タイプリージョン、実際にリフレッシュされるリージョンとして登録済みクリデンシャルを指定します。


クリデンシャルを作成、削除してフォームを閉じると対話モード・レポートが更新されるようになりました。クリデンシャルの作成、削除を実際に行ってアプリケーションの動作を確認してみてください。

作成したクリデンシャルを使ってオブジェクト・ストレージのネームスペースを取得することで、クリデンシャルが正しく登録されていかどうか確認する機能を追加します。

クリデンシャルを選択して開くフォームから、OCIのPL/SQL SDKを呼び出すようにします。フォームをページ・デザイナで開きます。

静的コンテンツのリージョンをクリデンシャルの下に作成します。コンポーネント・ギャラリリージョンを選択し、静的コンテンツレイアウト・ビューにドラッグ&ドロップします。


作成したリージョンのタイトルクリデンシャルのテストとし、サーバー側の条件としてタイプアイテムはNULLではないを選択し、アイテムP2_CREDENTIAL_NAMEを選択します。これで、P2_CREDENTIAL_NAMEがNULLでない、つまりすでにクリデンシャルが登録されている場合にのみ、このリージョンが表示されます。


テストで発行するのはオブジェクト・ストレージのネームスペースを取得するファンクションDBMS_CLOUD_OCI_OBS_OBJECT_STORAGE.GET_NAMESPACEです。このファンクションは引数としてクリデンシャル名とリージョンを受け取り、ネームスペースを返します。クリデンシャル名はP2_CREDENTIAL_NAMEから取得できるので、残りのリージョンの入力と、戻り値であるネームスペースを表示するページ・アイテムを作成します。

リージョンを入力するページ・アイテムP2_REGIONを作成します。リージョンのクリデンシャルのテスト上でコンテキスト・メニューを開き、ページ・アイテムの作成を実行します。新規に作成されたページ・アイテムの名前P2_REGIONとし、タイプテキスト・フィールドソースセッション・ステートの保持リクエストごと(メモリーのみ)を選択します。


続いてネームスペースを表示するページ・アイテムP2_NAMESPACEを作成します。 名前P2_NAMESPACEタイプ表示のみを選びます。ラベルNamespaceとし、設定ページの送信時に送信OFFにします。ソースセッション・ステートの保持リクエスト(メモリーのみ)を選択します。


PL/SQL SDKの呼び出しは動的アクションから行います。SAVEは使用することのないボタンなので、リージョンクリデンシャルのテストに移動し、設定を変更します。ボタン名B_GET_NAMESPACEに変更し、ラベルGet Namespaceとします。レイアウトボタン位置リージョンの下部とし、動作アクション動的アクションで定義を指定します。


ボタンをクリックしたときに、PL/SQLコードを実行しネームスペースを取得する動的アクションを作成します。ボタンB_GET_NAMESPACE上でコンテキスト・メニューを表示し、動的アクションの作成を実行します。作成した動的アクションの名前ネームスペースの取得とします。ボタン上で作成した動的アクションのタイミングはデフォルトで、イベントクリック選択タイプボタンボタンとしてB_GET_NAMESPACEとなりますが、一応、確認します。


続いてTrueアクションの設定を行います。識別アクションとしてサーバー側のコードを実行を選択します。設定言語PL/SQLで、PL/SQLコードとして以下を記述します。
declare
    response dbms_cloud_oci_obs_object_storage_get_namespace_response_t;
begin
    response := dbms_cloud_oci_obs_object_storage.get_namespace(
        compartment_id => null
        , region => :P2_REGION
        , credential_name => :P2_CREDENTIAL_NAME
    );
    if response.status_code != 200 then
        :P2_NAMESPACE := to_char(response.status_code, '9999');
    else
        :P2_NAMESPACE := response.response_body;
    end if;
end;
単にPL/SQL SDKを呼び出しているだけですが、呼び出しに失敗している場合はネームスペースの代わりにHTTPのステータスコードを返すようにしています。

送信するアイテムとしてP2_CREDENTIAL_NAMEP2_REGION戻すアイテムとしてP2_NAMESPACEを設定します。


以上でクリデンシャルのテストとして、オブジェクト・ストレージのネームスペースを取得する機能が追加されました。

アプリケーションを実行し、作成したクリデンシャルの編集アイコンをクリックしてフォームを開き、Get Namespaceのボタンをクリックします。ネームスペースが返されればクリデンシャルが正しく登録できています。


今回作成したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/ocicredentialmanager.sql

2025年3月26日 - APEX 24.2で更新
変更点: DBMS_CLOUD.SEND_REQUESTの呼び出しにネームスペースを取得し、PL/SQL SDKの呼び出しは止めた。
https://github.com/ujnak/apexapps/blob/master/exports/oci-credential-manager.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。