Providerを実装したインスタンスとは異なるインスタンスで、最初の記事の準備作業を行います。準備作業の結果としてAlways FreeのAutonomous Data WarehouseにAPEXのワークスペースdwapex、ワークスペース・スキーマwksp_dwapex、クリデンシャルSHARE_BUCKET_CREDENTIALは作成済みとします。また、DBMS_SHARE.ENABLE_SHARE、DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACEも実行済みとします。
Providerの記事で作成したAPEXアプリケーションをエクスポートし、Consumerを実装するインスタンスのAPEXワークスペースにインポートします。
インポートしたAPEXアプリケーションのConsumerのページに、以下の処理を組み込みます。
- Delta Sharingのプロファイルよりクリデンシャルを作成
- Share Providerを作成し、クリデンシャルを紐付け
- 利用可能なShareの一覧
- 利用可能なShare Tableの一覧
- Share Linkの作成、削除
- Share Link Viewの作成
以下より実装を進めます。
ページ・デザイナでConsumerのページを開きます。
Share Providerを一覧する対話モード・レポートShare Providersを作成します。ソースのSQL問合せは以下になります。
select * from user_share_providers
Share Providerを操作するために作成するフォームのページは、ページ番号が9、データ・ソースのSQLには以下を記述します。
select
provider_id,
provider_name,
'' delta_sharing_profile
from user_share_providers
主キー列1にはPROVIDER_IDを選択します。
フォームのページShare Providerが作成されます。
ページ・アイテムP9_PROVIDER_NAMEの識別のタイプをテキスト・フィールドに変更します。
ページ・アイテムP9_DELTA_SHARING_PROFILEの識別のタイプをテキスト領域に変更します。検証の最大長を4000に変更します。
Share Providerの作成、削除を行なうプロセスを作成します。デフォルトで作成されているプロセスプロセス・フォームShare Providerはコメント・アウトします。
プロセスCreateでは、以下のコードを実行します。ボタンCREATEの押下で実行します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
declare | |
credential_names clob; | |
jo json_object_t; | |
l_endpoint varchar2(4000); | |
begin | |
/* | |
* すでに"ProviderName$SHARED_CRED", "ProviderName$SHARED_CRED$TOKEN_REFRESH_CRED"が | |
* 存在する場合、あらかじめ削除しておく。そうしないと、自動的に一意の名前が付けられたクリデンシャルが | |
* 新規に作成される。 | |
*/ | |
for c in ( | |
select credential_name from user_credentials | |
where credential_name in ( | |
upper(:P9_PROVIDER_NAME) || '$SHARE_CRED', | |
upper(:P9_PROVIDER_NAME) || '$SHARE_CRED$TOKEN_REFRESH_CRED' | |
) | |
) | |
loop | |
dbms_cloud.drop_credential(c.credential_name); | |
end loop; | |
/* | |
* Delta Sharingプロファイルを元に、クリデンシャルを作成する。クリデンシャルは | |
* 削除済みなので、作成されるクリデンシャルの名前は決まっている。 | |
*/ | |
credential_names := dbms_share.create_credentials( | |
credential_base_name => :P9_PROVIDER_NAME | |
,delta_profile => :P9_DELTA_SHARING_PROFILE | |
); | |
/* | |
* プロファイルに含まれているエンドポイントを取り出す。 | |
*/ | |
jo := json_object_t(:P9_DELTA_SHARING_PROFILE); | |
l_endpoint := jo.get_string('endpoint'); | |
/* | |
* Providerを作成する。 | |
*/ | |
dbms_share.create_share_provider( | |
provider_name => :P9_PROVIDER_NAME | |
,endpoint => l_endpoint | |
); | |
/* | |
* 作成したProviderにクリデンシャルを紐づける。 | |
*/ | |
dbms_share.set_share_provider_credential( | |
provider_name => :P9_PROVIDER_NAME | |
,share_credential => :P9_PROVIDER_NAME || '$SHARE_CRED' | |
); | |
end; |
プロセスDeleteでは、以下のコードを実行します。ボタンDELETEの押下で実行します。
begin
dbms_share.drop_share_provider(
provider_name => :P9_PROVIDER_NAME
);
end;
Consumerのページに戻り対話モード・レポートShare Providersに、ボタンCREATE_SHARE_PROVIDERを作成します。ターゲットはページ9になります。
属性のリンク列をカスタム・ターゲットへのリンクとし、ターゲットはページ9、主キーのアイテムの名前としてP9_PROVIDER_ID、値となる列に\#PROVIDER_ID#\を指定します。
ダイアログがクローズしたときに対話モード・レポートShare Providersをリフレッシュする動的アクションを作成します。識別の名前はonClose Dialog Share Providerとします。
以上でShare Providersについて出来上がりました。動作を確認してみます。
アプリケーションを実行し、対話モード・レポートShare ProvidersにあるボタンCreateをクリックします。
Share ProviderとしてDEMO_PROVIDERが作成されます。
Providerに含まれるShareを選択し、共有可能な表の一覧を表示します。
最初にProviderを選択するページ・アイテムを作成します。
識別の名前はP3_PROVIDER_NAME、タイプは選択リストとします。ラベルはProviderとします。設定の選択時のページ・アクションとして値のリダイレクトと設定を選択します。
この後にShare Linkを作成する際に、Provider NameとShare Nameがその引数となります。ターゲットに設定した置換文字列はページ・レンダリング時にセッション・ステートに保存されている値で置き換えられるため、選択時のページ・アクションとして値のリダイレクトと設定を選び、値をセッション・ステートに保存した後にリダイレクトを発生させ、ページのレンダリングが行われるようにします。
select provider_name d, provider_name r from user_share_providers
追加値の表示はオフ、NULL値の表示はオン、NULL表示値は- Select Provider -とします。
詳細の保存されていない変更の警告を無視にします。セッション・ステートのストレージはセッションごと(永続)を選択します。
フォームのページShare Linkが作成されます。
Providerに含まれるShareから、Shareをひとつ選択するページ・アイテムを作成します。
識別の名前はP3_SHARE_NAME、タイプは選択リストとします。ラベルはShareとします。設定の選択時のページ・アクションとして値のリダイレクトと設定を選択します。P3_PROVIDER_NAMEの右隣に配置するため、レイアウトの新規行の開始をオフにします。
LOVのタイプはSQL問合せ、SQL問合せとして以下を記述します。
select available_share_name d, available_share_name r
from dbms_share.discover_available_shares(
coalesce(:P3_PROVIDER_NAME,'DUMMY')
)
追加値の表示はオフ、NULL値の表示はオン、NULL表示値は- Select Share -とします。
選択可能なShareはProviderに依存するため、カスケードLOVの親アイテムとしてP3_PROVIDER_NAMEを指定し、親が必要をオンにします。
詳細の保存されていない変更の警告を無視にします。セッション・ステートのストレージはセッションごと(永続)を選択します。
共有可能な表を一覧する対話モード・レポートAvailable Tables (Named)を作成します。
ソースのSQL問合せとして以下を記述します。share_provider、share_nameともにnullの場合は、全件が検索対象になります。
select * from dbms_share.discover_available_tables(
share_provider => :P3_PROVIDER_NAME
,share_name => :P3_SHARE_NAME
)
アプリケーションを実行して動作を確認します。
Provider側で作成したShareのDEMO_SHAREに追加された表CUSTSALESが一覧されます。
Share Linkの作成と削除を行なう機能を実装します。
作成する対話モード・レポートShare LinksのソースのSQL問合せは以下になります。
select * from user_share_links
Share Linkの作成と削除をするフォームのページは、ページ番号が10、名前はShare Link、データ・ソースのSQLには以下を記述します。
select
link_id,
link_name,
share_provider_name,
share_name
from user_share_links
主キー列1にはLINK_IDを選択します。
ページ・アイテムP10_LINK_NAME、P10_SHARE_PROVIDER_NAME、P10_SHARE_NAMEのタイプをテキスト・フィールドに変更します。
Share Linkの作成、削除を行なうプロセスを作成します。デフォルトで作成されているプロセスプロセス・フォームShare Linkはコメント・アウトします。
プロセスCreateでは、以下のコードを実行します。ボタンCREATEの押下で実行します。
begin
dbms_share.create_or_replace_share_link(
share_link_name => :P10_LINK_NAME
,share_provider => :P10_SHARE_PROVIDER_NAME
,share_name => :P10_SHARE_NAME
);
end;
プロセスDeleteでは、以下のコードを実行します。ボタンDELETEの押下で実行します。
begin
dbms_share.drop_share_link(
link_name => :P10_LINK_NAME
);
end;
以上でフォームについては完成です。
Consumerのページに戻り対話モード・レポートShare Linkに、ボタンCREATE_SHARE_LINKを作成します。ターゲットはページ10になります。
属性のリンク列をカスタム・ターゲットへのリンクとし、ターゲットはページ10、主キーのアイテムの名前としてP10_LINK_ID、値となる列に\#LINK_ID#\を指定します。
ダイアログがクローズしたときに対話モード・レポートShare Linksをリフレッシュする動的アクションを作成します。識別の名前はonClose Dialog Share Linkとします。
以上でShare Linksについて出来上がりました。動作を確認してみます。
アプリケーションを実行ます。
ProviderとしてDEMO_PROVIDER、ShareとしてDEMO_SHAREを選択し、対話モード・レポートShare LinksにあるボタンCreateをクリックします。
Link NameにSALES_DATAを入力します。Share Provider NameにはDEMO_PROVIDER、Share NameにはDEMO_SHAREが入力済みです。
作成をクリックします。
Share LinkとしてSALES_DATAが作成されます。
最後にShare Link Viewの一覧と作成を実装します。
Share Link Viewを一覧する対話モード・レポートShare Link Viewsを作成します。ソースのSQL問合せは以下になります。
select * from user_share_link_views
Share Link Viewを作成するフォームのページは、ページ番号が11、データ・ソースのSQLには以下を記述します。
select
'' id,
view_name,
link_name share_link_name,
share_schema_name,
share_table_name
from user_share_link_views
主キー列1にはIDを選択します。フォームのページShare Link Viewが作成されます。
ページ・アイテムP11_VIEW_NAMEの識別のタイプをテキスト・フィールドに変更します。
ページ・アイテムP11_SHARE_LINK_NAMEの識別のタイプを選択リストに変更します。
LOVのタイプはSQL問合せとし、SQL問合せに以下を記述します。
select link_name d, link_name r from user_share_links
追加値の表示はオフ、NULL値の表示はオン、NULL表示値は- Select Share Link -と記述します。
ページ・アイテムP11_SHARE_SCHEMA_NAMEの識別のタイプを選択リストに変更します。
LOVのタイプはSQL問合せとし、SQL問合せに以下を記述します。
select schema_name d, schema_name r from dbms_share.discover_available_tables(
share_name => (
select share_name from user_share_links where link_name = :P11_SHARE_LINK_NAME
)
)
追加値の表示はオフ、NULL値の表示はオン、NULL表示値は- Select Shema -と記述します。
カスケードLOVの親アイテムにP1_SHARE_LINK_NAMEを指定し、親が必要をオンにします。
LOVのタイプはSQL問合せとし、SQL問合せに以下を記述します。
select table_name d, table_name r from dbms_share.discover_available_tables(
share_name => (
select share_name from user_share_links where link_name = :P11_SHARE_LINK_NAME
)
)
where schema_name = :P11_SHARE_SCHEMA_NAME
追加値の表示はオフ、NULL値の表示はオン、NULL表示値は- Select Table -と記述します。
カスケードLOVの親アイテムにP11_SHARE_LINK_NAMEとP11_SHARE_SCHEMA_NAMEを指定し、親が必要をオンにします。
Share Link Viewを作成するプロセスを作成します。作成されたShare Link Viewはビューなので、DROP VIEWコマンドで削除できます。そのため、このアプリケーションでは作成のみを実装します。デフォルトで作成されているプロセスプロセス・フォームShare Link Viewはコメント・アウトします。
プロセスCreateでは、以下のコードを実行します。ボタンCREATEの押下で実行します。
begin
dbms_share.create_share_link_view(
view_name => :P11_VIEW_NAME
,share_link_name => :P11_SHARE_LINK_NAME
,share_schema_name => :P11_SHARE_SCHEMA_NAME
,share_table_name => :P11_SHARE_TABLE_NAME
);
end;
以上でフォームについては完成です。
Consumerのページに戻り対話モード・レポートShare Link Viewsに、ボタンCREATE_SHARE_LINK_VIEWを作成します。ターゲットはページ11になります。
ダイアログがクローズしたときに対話モード・レポートShare Link Viewsをリフレッシュする動的アクションを作成します。識別の名前はonClose Dialog Share Link Viewとします。
以上でShare Link Viewについて出来上がりました。
これでDelta Sharingによるデータ共有の実装は、すべて完了です。
アプリケーションを実行し、対話モード・レポートShare Link ViewsにあるボタンCreateをクリックします。
Link NameはCUSTSALES_SHARE_Vとします。Share Link NameとしてSALES_DATA、Share Schema NameとしてWKSP_DWAPEX、Share Table NameとしてCUSTSALESを順番に選択します。
作成をクリックします。
ビューCUSTSALES_SHARE_Vが作成されます。
SQLコマンドより、ビューCUSTSALES_SHARE_Vを検索します。
select * from custsales_share_v
Provider側に存在していた表CUSTSALESを、Delta Sharingを使って、別インスタンスのConsumerから参照することができました。
今回のシリーズ記事は以上になります。
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完