以前に書いた記事は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
クリデンシャルの作成
Oracle APEX 22.1以降でAutonomous Database上にワークスペースを作成している場合は、ワークスペース・スキーマ名はワークスペース名にWKSP_が接頭辞として追加されます。
ワークスペース名がAPEXDEVであれば、以下のようになります。
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;
/
% tr -d '\n\r' < apex_oci_api_key.pem
-----BEGIN PRIVATE KEY-----MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCu4Lv9Uv0zfkwX6zLJoWc3NTE*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************+ZW7JL3zKKyJBx+GAABlK4E6cMNuoG7sQY6EXtvh6jqRM1aBbzJSmLNDn3R9nvIFy3+OmQdBJrTCVoaFrtGresIOuQchho=-----END PRIVATE KEY-----
%
オブジェクト・ストレージのネームスペースの取得
APEXのワークスペース名がAPEXDEVの場合での実行画面は以下になります。
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;
APEXアプリケーションの作成
アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。名前をオブジェクト・ストレージ操作とします。
アプリケーションの作成を実行します。
- G_COMPARTMENT_ID - コンパートメントのOCID
- G_CREDENTIAL_NAME - クリデンシャル名
- G_NAMESPACE_NAME - ネームスペース名
- G_REGION - リージョン名
これからページの作成を始めますが、その前にPL/SQL SDKを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;