Oracle Databaseのバージョンを確認したいときは、V$VERSION、PRODUCT_COMPONENT_VERSION、DBMS_DB_VERSION、SQL*Plusの接続表示を目的に応じて使い分けます。
この記事では、DB本体のバージョン、コンポーネントのバージョン、PL/SQLで条件分岐に使うバージョン、SQL*Plusなどクライアント側の表示を、実務でそのまま使えるSQL例で整理します。
DB本体のバージョンを確認するだけなら
SELECT * FROM V$VERSION;が最短です。インスタンス単位で見るならV$INSTANCE、コンポーネントも含めて見るならPRODUCT_COMPONENT_VERSION、PL/SQL内でバージョン判定するならDBMS_DB_VERSION、SQL*PlusやInstant Clientのバージョンはクライアント側の表示で確認します。まず実行するSQL
Oracleのバージョン確認だけを急いでいる場合は、まず次のSQLを実行します。多くの環境では、これでOracle Database本体のリリースを確認できます。
SELECT * FROM V$VERSION;
サーバーのインスタンス名とバージョンを1行で確認したい場合は、V$INSTANCEも便利です。
SELECT
INSTANCE_NAME,
VERSION,
VERSION_FULL,
STATUS
FROM V$INSTANCE;
Oracle 18c以降では、BANNER_FULLに詳細な表示が入ります。列を絞って見やすくするなら、次のようにします。
SELECT BANNER_FULL FROM V$VERSION;
古いバージョンや互換性を考えるなら、まずBANNERを見る書き方も使えます。
SELECT BANNER FROM V$VERSION;
確認方法の使い分け
「Oracleのバージョン確認」といっても、確認したい対象がDB本体なのか、コンポーネントなのか、クライアントなのかで見る場所が変わります。
| 確認したいこと | 使うSQL・コマンド | 用途 |
|---|---|---|
| DB本体のバージョン | V$VERSION |
まず確認する基本の方法 |
| インスタンスのバージョン | V$INSTANCE |
インスタンス名、起動状態、バージョンを1行で確認 |
| コンポーネントのバージョン | PRODUCT_COMPONENT_VERSION |
Oracle Database、PL/SQL、関連コンポーネントの確認 |
| パッチ・RUの適用状況 | DBA_REGISTRY_SQLPATCH |
SQLパッチ、Release Updateの確認 |
| PL/SQL内の条件分岐 | DBMS_DB_VERSION |
バージョン別に処理を切り替える |
| CDB/PDBのどのコンテナか | V$VERSION.CON_ID |
マルチテナント環境で確認対象を意識する |
| SQL*Plusのバージョン | sqlplus -vまたは起動時表示 |
クライアント側のバージョン確認 |
Oracleのデータディクショナリビューの見方を広く確認したい場合は、Oracleのデータディクショナリ完全ガイドも参考になります。
V$VERSIONでDB本体のバージョンを確認する
V$VERSIONは、Oracle Databaseのバージョン確認で最もよく使う動的パフォーマンスビューです。Oracle公式ドキュメントでも、V$VERSIONはOracle Databaseのバージョン番号を表示するビューとして説明されています。
SELECT
BANNER,
BANNER_FULL,
BANNER_LEGACY,
CON_ID
FROM V$VERSION;
| 列 | 意味 |
|---|---|
BANNER |
コンポーネント名とバージョン番号です。 |
BANNER_FULL |
Oracle 18c以降で使える詳細なバージョン表示です。 |
BANNER_LEGACY |
Oracle 18cより前の形式に近い表示です。 |
CON_ID |
CDB/PDB環境で、どのコンテナの情報かを示します。 |
BANNER_FULLやBANNER_LEGACYは、古いOracle Databaseでは存在しないことがあります。互換性を重視するスクリプトでは、BANNERだけを参照するほうが無難です。
V$INSTANCEでインスタンスのバージョンを確認する
V$INSTANCEでは、現在接続しているインスタンスの名前、状態、バージョンを確認できます。RACや複数環境を扱っている場合、どのインスタンスに接続しているかを一緒に見られるのが利点です。
SELECT
INSTANCE_NAME,
HOST_NAME,
VERSION,
VERSION_FULL,
STATUS,
STARTUP_TIME
FROM V$INSTANCE;
VERSION_FULLは、Release Updateまで含めた細かいバージョン確認で役立ちます。ただし古いOracleでは列が存在しない場合があるため、汎用スクリプトではVERSIONだけを見る形も用意しておくと安全です。
-- 古いOracleでも通しやすい書き方
SELECT
INSTANCE_NAME,
HOST_NAME,
VERSION,
STATUS
FROM V$INSTANCE;
PRODUCT_COMPONENT_VERSIONでコンポーネントを確認する
PRODUCT_COMPONENT_VERSIONは、コンポーネント製品のバージョンとステータスを確認するビューです。Oracle公式ドキュメントでは、PRODUCT、VERSION、VERSION_FULL、STATUSなどの列が説明されています。
SELECT
PRODUCT,
VERSION,
VERSION_FULL,
STATUS
FROM PRODUCT_COMPONENT_VERSION
ORDER BY PRODUCT;
Oracle Databaseのメジャーバージョンだけでなく、コンポーネントの表示も確認したいときに便利です。ただし、VERSION_FULLはOracle 18c以降の新しいバージョン体系向けの列なので、古い環境では存在しない場合があります。
-- 古いOracleでも通しやすい書き方
SELECT
PRODUCT,
VERSION,
STATUS
FROM PRODUCT_COMPONENT_VERSION
ORDER BY PRODUCT;
SQL*Plusで接続先DBのバージョンを確認する
SQL*Plusでは、起動時や接続時にSQL*Plus自身のバージョンと、接続先Oracle Databaseのバージョンが表示されます。Oracle公式ドキュメントでも、SQL*Plus起動時にSQL*PlusのReleaseやVersion、接続後にOracle DatabaseのReleaseが表示される例が示されています。
SQL*Plus: Release 19.0.0.0.0 - Production Version 19.20.0.0.0 Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
ここで注意したいのは、SQL*PlusのバージョンとDB本体のバージョンは別物という点です。手元のクライアントが19cでも、接続先DBが12cや21cということはあります。
sqlplus -v
SQL*Plusの基本的な使い方は、Oracle SQL*Plus完全ガイドで整理しています。
PL/SQLではDBMS_DB_VERSIONを使う
PL/SQLの中でOracle Databaseのバージョンに応じて処理を切り替えたい場合は、DBMS_DB_VERSIONパッケージを使います。Oracle公式ドキュメントでは、このパッケージはOracleバージョン番号などを提供し、条件付きコンパイルの選択に役立つものとして説明されています。
BEGIN
DBMS_OUTPUT.PUT_LINE('VERSION=' || DBMS_DB_VERSION.VERSION);
DBMS_OUTPUT.PUT_LINE('RELEASE=' || DBMS_DB_VERSION.RELEASE);
END;
/
条件付きコンパイルで使うなら、次のような書き方になります。
$IF DBMS_DB_VERSION.VER_LE_19 $THEN
DBMS_OUTPUT.PUT_LINE('19c以下向けの処理');
$ELSE
DBMS_OUTPUT.PUT_LINE('新しいバージョン向けの処理');
$END
条件付きコンパイルそのものは、PL/SQL条件付きコンパイル完全ガイドで詳しく扱っています。
CDB/PDB環境ではどこに接続しているかも確認する
Oracle 12c以降のマルチテナント構成では、CDB rootに接続しているのか、PDBに接続しているのかも重要です。バージョン確認とあわせて、現在のコンテナを見ておくと安全です。
SHOW CON_NAME;
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') AS con_name
FROM dual;
V$VERSIONにはCON_ID列があります。CDB/PDBで表示が複数行になるビューを扱う場合は、どのコンテナの情報を見ているかを意識しましょう。
Data PumpではDBバージョンとdumpの互換性も見る
バージョン確認が必要になる場面として多いのが、Data Pumpのエクスポート・インポートです。移行元と移行先でOracle Databaseのバージョンが違う場合、expdpのVERSIONパラメータや、互換性の確認が必要になることがあります。
expdp system/password schemas=APP dumpfile=app.dmp logfile=app.log VERSION=19.0
Data Pumpのバージョン違い対応は、バージョンが違うDBでData Pumpを使うときの注意点で詳しく整理しています。
パッチ適用状況はDBA_REGISTRY_SQLPATCHを見る
V$VERSIONやV$INSTANCEで大まかなバージョンは分かりますが、Release UpdateやSQLパッチの適用履歴まで確認したい場合はDBA_REGISTRY_SQLPATCHを見ます。パッチ適用後の確認、障害調査、サポート問い合わせでは、この情報が重要になることがあります。
SELECT
PATCH_ID,
PATCH_TYPE,
ACTION,
STATUS,
DESCRIPTION,
ACTION_TIME
FROM DBA_REGISTRY_SQLPATCH
ORDER BY ACTION_TIME DESC;
DBA_REGISTRY_SQLPATCHの参照には権限が必要です。参照できない場合は、DBAに確認するか、サーバー側でopatch lsinventoryなどの情報を確認します。SQLで見える情報とOracle Homeに適用されているパッチ情報は、調査目的に応じて使い分けます。
opatch lsinventory
よくある勘違い
| 勘違い | 正しい見方 |
|---|---|
| SQL*PlusのバージョンがDB本体のバージョンだと思う | SQL*Plusはクライアント側です。DB本体は接続後の表示やV$VERSIONで確認します。 |
V$VERSIONだけで全コンポーネントの状態が分かると思う |
コンポーネントの一覧はPRODUCT_COMPONENT_VERSIONも見ます。 |
VERSION_FULLが必ず存在すると思う |
Oracle 18c以降向けの列です。古い環境ではVERSIONやBANNERを使います。 |
| 19cと19.20を同じ粒度で扱う | 19cはリリース名、19.20はRelease Updateまで含む細かい表記です。パッチ確認では細かい番号も重要です。 |
V$VERSIONだけでパッチ履歴まで分かると思う |
SQLパッチの履歴はDBA_REGISTRY_SQLPATCHも確認します。 |
権限不足でV$VERSIONが見えない場合
環境によっては、V$VERSIONなどの動的パフォーマンスビューを参照する権限がないことがあります。その場合は、DBAに確認するか、参照可能なビューや接続時表示で代替します。
SELECT PRODUCT, VERSION, STATUS FROM PRODUCT_COMPONENT_VERSION;
アプリケーション接続ユーザーで運用している場合、必要以上に強い権限を付けるのは避けます。調査用ユーザー、DBAロール、監視用アカウントなど、運用ルールに沿って確認しましょう。
まとめ
Oracleのバージョンを確認する基本はV$VERSIONです。インスタンス名や起動状態も見るならV$INSTANCE、コンポーネントまで見るならPRODUCT_COMPONENT_VERSION、パッチ履歴まで見るならDBA_REGISTRY_SQLPATCH、PL/SQLでバージョン判定するならDBMS_DB_VERSION、クライアント側を見るならSQL*Plusの起動表示やsqlplus -vを確認します。
特に移行、Data Pump、パッチ適用、障害調査では、DB本体のリリース名だけでなく、Release Updateまで含む細かい番号、接続先コンテナ、クライアント側のバージョンを分けて確認しましょう。
参考
V$VERSION – Oracle Database Reference
V$INSTANCE – Oracle Database Reference
PRODUCT_COMPONENT_VERSION – Oracle Database Reference
DBA_REGISTRY_SQLPATCH – Oracle Database Reference
DBMS_DB_VERSION – Oracle Database PL/SQL Packages and Types Reference

