2021年4月6日火曜日

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

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

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

drop type t_bucket_tbl;
drop type t_bucket_row;
create or replace type t_bucket_row as object
(
id varchar2(4000)
,namespace varchar2(4000)
,name varchar2(4000)
,compartment_id varchar2(4000)
,created_by varchar2(4000)
,time_created timestamp(6) with time zone
,etag varchar2(4000)
)
/
create or replace type t_bucket_tbl as table of t_bucket_row
/
/*
* リージョン、ネームスペース、コンパートメントを指定し、そこに含まれるバケットの一覧を取得する。
*/
create or replace function list_buckets
(
p_namespace_name in varchar2
,p_compartment_id in varchar2
,p_region in varchar2
,p_credential_name in varchar2
)
return t_bucket_tbl pipelined
as
response dbms_cloud_oci_obs_object_storage_list_buckets_response_t;
bucket dbms_cloud_oci_object_storage_bucket_summary_t;
l_bucket t_bucket_row;
plsql_sdk_error exception;
begin
response := dbms_cloud_oci_obs_object_storage.list_buckets(
namespace_name => p_namespace_name
,compartment_id => p_compartment_id
,region => p_region
,credential_name => p_credential_name
);
if response.status_code != 200 then
raise plsql_sdk_error;
end if;
for i in 1 .. response.response_body.count
loop
bucket := response.response_body(i);
l_bucket := t_bucket_row(
bucket.name -- nameが一意なのでnameをidとする
,bucket.namespace
,bucket.name
,bucket.compartment_id
,bucket.created_by
,bucket.time_created
,bucket.etag
);
pipe row(l_bucket);
end loop;
end;
/
実行には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に変更します。

declare
l_create_bucket_details dbms_cloud_oci_object_storage_create_bucket_details_t;
l_update_bucket_details dbms_cloud_oci_object_storage_update_bucket_details_t;
l_create_response dbms_cloud_oci_obs_object_storage_create_bucket_response_t;
l_update_response dbms_cloud_oci_obs_object_storage_update_bucket_response_t;
l_delete_response dbms_cloud_oci_obs_object_storage_delete_bucket_response_t;
l_status_code integer;
plsql_sdk_error exception;
begin
case
when :APEX$ROW_STATUS = 'C' then
l_create_bucket_details :=
new dbms_cloud_oci_object_storage_create_bucket_details_t;
l_create_bucket_details.name := :P3_NAME;
l_create_bucket_details.compartment_id := :P3_COMPARTMENT_ID;
l_create_response := dbms_cloud_oci_obs_object_storage.create_bucket
(
namespace_name => :P3_NAMESPACE
, create_bucket_details => l_create_bucket_details
, region => :G_REGION
, credential_name => :G_CREDENTIAL_NAME
);
l_status_code := l_create_response.status_code;
when :APEX$ROW_STATUS = 'U' then
-- 何もアップデートしないけど、参考のためにupdate_bucketを呼び出します。
l_update_bucket_details :=
new dbms_cloud_oci_object_storage_update_bucket_details_t;
l_update_response := dbms_cloud_oci_obs_object_storage.update_bucket
(
namespace_name => :P3_NAMESPACE
, bucket_name => :P3_NAME
, update_bucket_details => l_update_bucket_details
, region => :G_REGION
, credential_name => :G_CREDENTIAL_NAME
);
l_status_code := l_create_response.status_code;
when :APEX$ROW_STATUS = 'D' then
l_delete_response := dbms_cloud_oci_obs_object_storage.delete_bucket
(
namespace_name => :P3_NAMESPACE
, bucket_name => :P3_NAME
, region => :G_REGION
, credential_name => :G_CREDENTIAL_NAME
);
l_status_code := l_create_response.status_code;
end case;
if l_status_code != 200 then
raise plsql_sdk_error;
end if;
end;


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

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


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


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

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

作成をクリックします。


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


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


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


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


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


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

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

続く