2022年4月27日水曜日

接触追跡のファンクションを表関数から呼び出す

 以前の記事で、Oracle Spatialの接触追跡のファンクションを呼び出す方法について説明しました。その際にAPEXのワークスペースから呼び出すと行が返されないため(sdo_obj_tracing.get_all_durationsの引数track_table_nameとして与える表名を所有者で修飾することにより、異なるユーザーから呼び出すことができました)、RESTサービスにラップしています。

RESTサービスで実装する前に、表関数による実装も試していたので、その作業を記録として残しておきます。

データベース・ユーザーSPATIALUSERで以下のコードを実行し、表関数contact_tracingを作成しました。

データベース・アクションにて実行しています。

表関数contact_tracingを使った接触追跡は、以下のSELECT文で行います。

select * 
from table(contact_tracing(
    7
    , to_date('2020-05-31 00:00:00','YYYY-MM-DD HH24:MI:SS')
    , to_date('2020-05-31 23:59:59','YYYY-MM-DD HH24:MI:SS')
    , 15
    , 5
    , 20
))

座標値を除いた結果を確認してみます。

select distinct contact_id, in_user_id, out_user_id, duration_in_minutes, start_time, end_time, num_contact_times 
from table(contact_tracing(
    7
    , to_date('2020-05-31 00:00:00','YYYY-MM-DD HH24:MI:SS')
    , to_date('2020-05-31 23:59:59','YYYY-MM-DD HH24:MI:SS')
    , 15
    , 5
    , 20
))

続いて、ユーザーADMINから検索します。

ユーザーadminに表関数contact_tracingの実行権限を与えます。ユーザーSPATIALUSERにて、以下のコマンドを実行します。

grant execute on contact_tracing to admin;


SELECT文を変更しなくて済むように、シノニムを作成します。ユーザーADMINにて、以下のコマンドを実行します。

create synonym contact_tracing for spatialuser.contact_tracing;


ユーザーADMINにて、SELECT文を実行します。


ユーザーSPATIALUSERで実行した場合と同じ結果が得られます。

APEXのレポートでデータ・ソースが複雑になる場合に、表関数を利用する一例として紹介してみました。

以上になります。

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