2021年6月15日火曜日

自動化のアクションを途中で停止する

 以前の記事でOracle APEXの自動化の機能を使って、外部のExcelをロードする方法を紹介しています。

作成した自動化では、データの取得というアクションによって、オープンデータのExcelファイルを取得し一旦データベースに保存し、その後、データのロードというアクションによって、ファイルの内容をパースし表に保存しています。

取得したデータが以前と変更がなければ、後続のアクションであるデータのロードは実行する必要はありません。そのように動作するよう、実装してみました。


アクションデータの取得PL/SQLコードを以下に変更しています。

declare
l_blob blob;
l_last_blob blob;
e_already_loaded exception;
begin
l_blob := apex_web_service.make_rest_request_b
(
p_url => :IRYO_RESULT_URL,
p_http_method => 'GET'
);
select content into l_last_blob from covid19_iryo_data
where id = (select max(id) from covid19_iryo_data);
if dbms_lob.compare(l_blob, l_last_blob) = 0 then
apex_automation.log_info('Skip data loading because the data is not updated.');
raise e_already_loaded;
else
apex_automation.log_info('The data is updated.');
insert into covid19_iryo_data(store_date, content) values(sysdate, l_blob);
end if;
end;

直近に取得したExcelファイル(l_last_blobに保存)とHTTP経由で取得したExcelファイルのデータ(l_blobに保存)を比較し、両方が一致している場合(dbms_lob.compreの結果が0)、ユーザー定義の例外e_already_loadedを発生させています。

アクションのエラー処理自動化の中断に変更すると、例外が発生したアクションで自動化は終了し、後続のアクションは実行されません。自動化の無効化とは異なり、スケジュール・ステータスは無効にならないので、自動化は次回の時間になると再度実行されます。

プロシージャAPEX_AUTOMATION.LOG_INFOを呼び出し、処理の経過を自動化メッセージに書き込んでいます。書き込んだメッセージは自動化実行ログより確認できます。


APEX_AUTOMATION.LOG_INFOで書き込んだ文字列を確認することができます。


自動化の実行状況やログは、ビューAPEX_AUTOMATION_LOGまたはAPEX_AUTOMATION_MSG_LOGからも確認することができます。

以上です。

追記

apex_automation.exitを使うことができます。アクションの開始問合せでない場合、以降のアクションがスキップされ、自動化処理としては成功で終了します。skip_current_rowもアクションが問合せでなければ、同様の動作になります。

declare
l_blob blob;
l_last_blob blob;
e_already_loaded exception;
begin
l_blob := apex_web_service.make_rest_request_b
(
p_url => :IRYO_RESULT_URL,
p_http_method => 'GET'
);
select content into l_last_blob from covid19_iryo_data
where id = (select max(id) from covid19_iryo_data);
if dbms_lob.compare(l_blob, l_last_blob) = 0 then
apex_automation.exit('Skip data loading because the data is not updated.');
-- apex_automation.log_info('Skip data loading because the data is not updated.');
-- raise e_already_loaded;
else
apex_automation.log_info('The data is updated.');
insert into covid19_iryo_data(store_date, content) values(sysdate, l_blob);
end if;
end;


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