Sunday, November 29, 2009

バージョン互換性を備えたスクリプト作り

オラクルバージョンが多様になり、バージョンごと支援するオブジェクトが変わるによりバージョン互換性を持つスクリプトを作るのが少しづつ難しくなっていきます。(幸いに基本となるオブジェクトたちは大きな変化がないので問題が深刻ではないけれどね)


例えば、9i以下だったらV$SESSION_WAITビューから、10g以上だったらV$SESSIONビューから待機イベント情報を抽出するスクリプトが作りたいんです。PL/SQLを利用せずSQL*Plusで実行可能な一つのスクリプトファイルで作りたければどうしたらいいでしょうか。多い方法があるはずですが次のような簡単なトリックが使えます。


col is_10g new_value __is_10g
col is_9i new_value __is_9i

with v as (
select
to_number(substr(banner,
instr(banner, 'Release ')+8,
instr(banner, '.') - instr(banner, 'Release ')-8)) as version
from v$version where rownum = 1
)
select
case when version >= 10 then '' else '--' end as is_10g,
case when version <= 9 then '' else '--' end as is_9i
from v
;

__is_19g、__is_9i置換変数を利用して次のように手軽に解決します。

select * from (
&__is_10g select event, p1, p2, p3 from v$session
&__is_9i select event, p1, p2, p3 from v$session_wait
)
;

応用したら次のようにバージョン別にコラムまで操作できます。

select
sid
,serial#
&__is_10g ,event
&__is_10g ,p1
from
v$session
;

SQL*Plusの強力さが分かる良い例と言えます。

No comments:

Post a Comment