OWA_COOKIEパッケージによるクッキー出力の怪

mod_plsqlを使用したWebアプリケーションでクッキーを出力する場合、OWA_COOKIEパッケージのSENDプロシージャを使用する。

このSENDプロシージャ、以下の引数をとる。

OWA_COOKIE.SEND(
   name           in       varchar2,
   value          in       varchar2,
   expires        in       date       DEFAULT NULL,
   path           in       varchar2   DEFAULT NULL,
   domain         in       varchar2   DEFAULT NULL,
   secure         in       varchar2   DEFAULT NULL);

この中の expires 引数は、クッキーの有効期限を設定するものだ。30分だけ有効なクッキーにしたいと SYSDATE+30/(60*24) を渡したところ、17時間半後の時間に設定され、17時間ずれた。日本時間で17時間半後なので、GMTだと8時間半後の値がSet-Cookieされている。

よくわからない時間差であったが、OWA_COOKIEの説明に「The system date is calculated with reference to the information specified in the OWA_CUSTOM package.」と書いてあるのを完全にスルーしていたのが原因だ。OWA_COOKIE日時計算はOWA_CUSTOMパッケージの設定に依存しており、OWA_CUSTOMのdbms_server_timezone定数に設定されたタイムゾーンが使われる。
自分の環境ではdbms_server_timezoneは'PST'となっており、「太平洋標準時(Pacific Standard Time: PST)」を使う事になっている。このPST、GMTとの時間差が-07:00。つまり、現在時刻が日本時刻で21:00で、21:30に切れるつもりでSYSDATEを使っても、その21:00はPSTでの21:00と解釈され、日本時間だと +07:00 +09:00 で 16時間後の時刻(翌13:00)扱いになる。
17時間のずれを説明するには1時間たりないのだが、恐らくサマータイムの1時間だと思うのでこれ以上は考えないことにする。

対策

セッション用のクッキーについては、有効期間をNULLにして、ブラウザセッションの継続期間中のみにすればよい、ということになったので、何も指定しないデフォルトがよい。

あえて有効期間を指定したいのであれば、OWA_CUSTOMのdbms_server_timezone, dbms_server_gmtdiff を設定して、同パッケージを再コンパイルするか、PSTのつもりでDATE型の値を作って渡すことになる(SELECT SYSTIMESTAMP AT TIME ZONE 'PST' FROM DUAL; により現在のPSTの時刻がわかるので、それをもとにDATE値を作る。面倒面倒・・・)。

どうしてこんな仕様になっているんだろうか・・・わかりにくすぎる。9時間のずれだったらとっかかりも多かったのだが、17時間だとピンとくるものがないので調査に時間がかかった(そしてマニュアルに答えがあったという疲労感がたっぷりなオチ)。