2021年1月13日水曜日

ADWはresult_cache_modeがforceであることに注意

 Autonomous Databaseのワークロード・タイプとして、Data WarehouseとTransaction Processingがあります。このワークロード・タイプで、初期化パラメータresult_cache_modeが異なります。ADWはforceになっており、その場合に少々コーディングで気を付けるべきことがありました。

2023年5月16日追記 ----

May 2023のアップデートで、ADBのRESULT_CACHE_MODEを変更できるようになりました。

What’s New for Oracle Autonomous Database on Shared Exadata Infrastructure
RESULT_CACHE_MODE Parameter is Modifiable at Session and System Level
----

タイプがPL/SQL動的コンテンツのリージョンを作成し、以下のコードを記述します。

declare
l_app_user varchar2(80);
begin
select v('APP_USER') into l_app_user from dual;
htp.p('<p>v function: ' || l_app_user || '</p>');
select sys_context('APEX$SESSION','APP_USER') into l_app_user from dual;
htp.p('<p>sys_context: ' || l_app_user || '</p>');
l_app_user := v('APP_USER');
htp.p('<p>PL/SQL: ' || l_app_user || '</p>');
end;

最初にユーザーRESCACHE001でサインインし、このリージョンの表示を確認します。

サインアウトし、次にユーザーRESCACHE002にてサインインします。同じリージョンの表示が以下になります。


つまり、以下のSQLは結果キャッシュが働くため、以前の検索結果が返されることがあり得ます。

select v('APP_USER') into l_app_user from dual;

Oracle APEXが提供するvファンクションだけではなく、ファンクション全般に言えることだと思いますが、v('APP_USER')の結果はOracle APEXアプリケーションにたいして影響が大きいので要注意です。

なお、result_cache_modeがmanualである、Autonomous Transaction Processingでは発生しない現象です。