【Oracle】バージョンを確認するSQL|V$VERSION・PRODUCT_COMPONENT_VERSION・SQL*Plusで確認

【Oracle】バージョンを確認するSQL|V$VERSION・PRODUCT_COMPONENT_VERSION・SQL*Plusで確認 Oracle

Oracle Databaseのバージョンを確認したいときは、V$VERSIONPRODUCT_COMPONENT_VERSIONDBMS_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本体のリリースを確認できます。

oracle-version-quick-check.sql
SELECT *
FROM V$VERSION;

サーバーのインスタンス名とバージョンを1行で確認したい場合は、V$INSTANCEも便利です。

oracle-instance-version.sql
SELECT
    INSTANCE_NAME,
    VERSION,
    VERSION_FULL,
    STATUS
FROM V$INSTANCE;

Oracle 18c以降では、BANNER_FULLに詳細な表示が入ります。列を絞って見やすくするなら、次のようにします。

oracle-version-banner-full.sql
SELECT BANNER_FULL
FROM V$VERSION;

古いバージョンや互換性を考えるなら、まずBANNERを見る書き方も使えます。

oracle-version-banner.sql
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のバージョン番号を表示するビューとして説明されています。

v-version-basic.sql
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_FULLBANNER_LEGACYは、古いOracle Databaseでは存在しないことがあります。互換性を重視するスクリプトでは、BANNERだけを参照するほうが無難です。

V$INSTANCEでインスタンスのバージョンを確認する

V$INSTANCEでは、現在接続しているインスタンスの名前、状態、バージョンを確認できます。RACや複数環境を扱っている場合、どのインスタンスに接続しているかを一緒に見られるのが利点です。

v-instance-version.sql
SELECT
    INSTANCE_NAME,
    HOST_NAME,
    VERSION,
    VERSION_FULL,
    STATUS,
    STARTUP_TIME
FROM V$INSTANCE;

VERSION_FULLは、Release Updateまで含めた細かいバージョン確認で役立ちます。ただし古いOracleでは列が存在しない場合があるため、汎用スクリプトではVERSIONだけを見る形も用意しておくと安全です。

v-instance-compatible.sql
-- 古いOracleでも通しやすい書き方
SELECT
    INSTANCE_NAME,
    HOST_NAME,
    VERSION,
    STATUS
FROM V$INSTANCE;

PRODUCT_COMPONENT_VERSIONでコンポーネントを確認する

PRODUCT_COMPONENT_VERSIONは、コンポーネント製品のバージョンとステータスを確認するビューです。Oracle公式ドキュメントでは、PRODUCTVERSIONVERSION_FULLSTATUSなどの列が説明されています。

product-component-version.sql
SELECT
    PRODUCT,
    VERSION,
    VERSION_FULL,
    STATUS
FROM PRODUCT_COMPONENT_VERSION
ORDER BY PRODUCT;

Oracle Databaseのメジャーバージョンだけでなく、コンポーネントの表示も確認したいときに便利です。ただし、VERSION_FULLはOracle 18c以降の新しいバージョン体系向けの列なので、古い環境では存在しない場合があります。

product-component-compatible.sql
-- 古い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が表示される例が示されています。

sqlplus-start-display.txt
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-client-version.txt
sqlplus -v

SQL*Plusの基本的な使い方は、Oracle SQL*Plus完全ガイドで整理しています。

PL/SQLではDBMS_DB_VERSIONを使う

PL/SQLの中でOracle Databaseのバージョンに応じて処理を切り替えたい場合は、DBMS_DB_VERSIONパッケージを使います。Oracle公式ドキュメントでは、このパッケージはOracleバージョン番号などを提供し、条件付きコンパイルの選択に役立つものとして説明されています。

dbms-db-version.sql
BEGIN
    DBMS_OUTPUT.PUT_LINE('VERSION=' || DBMS_DB_VERSION.VERSION);
    DBMS_OUTPUT.PUT_LINE('RELEASE=' || DBMS_DB_VERSION.RELEASE);
END;
/

条件付きコンパイルで使うなら、次のような書き方になります。

dbms-db-version-conditional.sql
$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に接続しているのかも重要です。バージョン確認とあわせて、現在のコンテナを見ておくと安全です。

current-container.sql
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のバージョンが違う場合、expdpVERSIONパラメータや、互換性の確認が必要になることがあります。

datapump-version-example.txt
expdp system/password schemas=APP dumpfile=app.dmp logfile=app.log VERSION=19.0

Data Pumpのバージョン違い対応は、バージョンが違うDBでData Pumpを使うときの注意点で詳しく整理しています。

パッチ適用状況はDBA_REGISTRY_SQLPATCHを見る

V$VERSIONV$INSTANCEで大まかなバージョンは分かりますが、Release UpdateやSQLパッチの適用履歴まで確認したい場合はDBA_REGISTRY_SQLPATCHを見ます。パッチ適用後の確認、障害調査、サポート問い合わせでは、この情報が重要になることがあります。

dba-registry-sqlpatch.sql
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.txt
opatch lsinventory

よくある勘違い

勘違い 正しい見方
SQL*PlusのバージョンがDB本体のバージョンだと思う SQL*Plusはクライアント側です。DB本体は接続後の表示やV$VERSIONで確認します。
V$VERSIONだけで全コンポーネントの状態が分かると思う コンポーネントの一覧はPRODUCT_COMPONENT_VERSIONも見ます。
VERSION_FULLが必ず存在すると思う Oracle 18c以降向けの列です。古い環境ではVERSIONBANNERを使います。
19cと19.20を同じ粒度で扱う 19cはリリース名、19.20はRelease Updateまで含む細かい表記です。パッチ確認では細かい番号も重要です。
V$VERSIONだけでパッチ履歴まで分かると思う SQLパッチの履歴はDBA_REGISTRY_SQLPATCHも確認します。

権限不足でV$VERSIONが見えない場合

環境によっては、V$VERSIONなどの動的パフォーマンスビューを参照する権限がないことがあります。その場合は、DBAに確認するか、参照可能なビューや接続時表示で代替します。

version-with-product-component.sql
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

Starting SQL*Plus – Oracle SQL*Plus User Guide