174

I'm building an installer for an application. The user gets to select a datasource they have configured and nominate what type of database it is. I want to confirm that the database type is indeed Oracle, and if possible, what version of Oracle they are running by sending a SQL statement to the datasource.

2
  • What about your programming language? This kind of question really depends on the language API for the DB access. Commented Sep 19, 2008 at 11:29
  • I can assume I have a JDBC datasource. If the connection fails, or the sql statement generates and error then I can certainly trap that and treat it accordingly. Commented Sep 19, 2008 at 11:37

12 Answers 12

298

Run this SQL:

select * from v$version;

And you'll get a result like:

BANNER
----------------------------------------------------------------
Oracle Database 10g Release 10.2.0.3.0 - 64bit Production
PL/SQL Release 10.2.0.3.0 - Production
CORE    10.2.0.3.0      Production
TNS for Solaris: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production
Sign up to request clarification or add additional context in comments.

10 Comments

All versions of Oracle I have ever used. I can't speak for Oracle 5.0 and before!
This technique failed for me on Oracle 11.2.0.2.0, but I am having some login permission problems. However, for those that might be in the same boat as me, the second technique mentioned on this page by Lawrence did work: select * from product_component_version
Doesn't work if you don't have permission to v$views. Lawrence's answer has an answer for that
@TonyAndrews: What is the output like when select * from v$version; fails?
@AtmeshMishra: I'm not sure - maybe ORA-00942: table or view does not exist? What do you get?
|
49

Two methods:

select * from v$version;

will give you:

Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for Solaris: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production

OR Identifying Your Oracle Database Software Release:

select * from product_component_version;

will give you:

PRODUCT VERSION STATUS
NLSRTL  11.1.0.6.0  Production
Oracle Database 11g Enterprise Edition  11.1.0.6.0  64bit Production
PL/SQL  11.1.0.6.0  Production
TNS for Solaris:    11.1.0.6.0  Production

2 Comments

great... i needed product_component_version.. as i didnt have access to v$ views
That second query is far more suitable for automatic checking, as it requires defines a data format, rather than relying on ad-hoc parsing. Thanks for posting!
32
SQL> SELECT version FROM v$instance;
VERSION
-----------------
11.2.0.3.0

6 Comments

Best answer since it just gives the version number only, hence no need to parse the output to extract version in an automated script.
@omeinush Works perfectly with me (11.2.0.3 ).
@tjati It appears to be dependent not on the version, but on the user permissions. V$INSTANCE is apparently not globally available by default.
It does not work on Oracle 18c: SQL> SELECT version FROM v$instance; SELECT version FROM v$instance * ERROR at line 1: ORA-00942: table or view does not exist
Requires dba privilege.
|
8

You can either use

SELECT * FROM v$version;

or

SET SERVEROUTPUT ON
EXEC dbms_output.put_line( dbms_db_version.version );

if you don't want to parse the output of v$version.

Comments

3

If your instance is down, you are look for version information in alert.log

Or another crude way is to look into Oracle binary, If DB in hosted on Linux, try strings on Oracle binary.

strings -a $ORACLE_HOME/bin/oracle |grep RDBMS | grep RELEASE

Comments

3

There are different ways to check Oracle Database Version. Easiest way is to run the below SQL query to check Oracle Version.

SQL> SELECT * FROM PRODUCT_COMPONENT_VERSION;
SQL> SELECT * FROM v$version;

Comments

2

For Oracle use:

Select * from v$version;

For SQL server use:

Select @@VERSION as Version

and for MySQL use:

Show variables LIKE "%version%";

Comments

0

We can use the below Methods to get the version Number of Oracle.

Method No : 1

set serveroutput on;
BEGIN 
DBMS_OUTPUT.PUT_LINE(DBMS_DB_VERSION.VERSION || '.' || DBMS_DB_VERSION.RELEASE); 
END;

Method No : 2

SQL> select *
  2  from v$version;

Comments

0

This will work starting from Oracle 10

select version
      , regexp_substr(banner, '[^[:space:]]+', 1, 4) as edition 
from    v$instance
     ,  v$version where regexp_like(banner, 'edition', 'i');

Comments

0

The following SQL statement:

select edition,version from v$instance

returns:

  • database edition eg. "XE"
  • database version eg. "12.1.0.2.0"

Notes:

  1. select privilege on the v$instance view is of course necessary
  2. the edition columnn is not available pre Oracle 12.1

5 Comments

@Prokhozhii - We now use 19 so i can no longer confirm but I would appreciate it if you could provide additional explanation as select version from v$instance definitely works in Oracle 11 . See answer stackoverflow.com/a/8135737/3051627 above. (are you 100% sure the user has access to v$instance on your database?)
SQL> select edition,version from v$instance; select edition,version from v$instance * ERROR at line 1: ORA-00904: "EDITION": invalid identifier
For Oracle 21, V$INSTANCE
@Prokhozhii thanks - in the documentation "edition" is only introduced in Oracle 12.1. docs.oracle.com/database/121/REFRN/… I have updated my comment accordingly.
-1

Here's a simple function:

CREATE FUNCTION fn_which_edition
        RETURN VARCHAR2
    IS

    /*

        Purpose: determine which database edition

        MODIFICATION HISTORY
        Person      Date        Comments
        ---------   ------      -------------------------------------------
        dcox        6/6/2013    Initial Build

    */

    -- Banner
    CURSOR c_get_banner
    IS
        SELECT banner
          FROM v$version
         WHERE UPPER(banner) LIKE UPPER('Oracle Database%');

    vrec_banner c_get_banner%ROWTYPE; -- row record
    v_database VARCHAR2(32767); --

BEGIN
    -- Get banner to get edition
    OPEN c_get_banner;
    FETCH c_get_banner INTO vrec_banner;
    CLOSE c_get_banner;

    -- Check for Database type
    IF INSTR( UPPER(vrec_banner.banner), 'EXPRESS') > 0
    THEN
        v_database := 'EXPRESS';
    ELSIF INSTR( UPPER(vrec_banner.banner), 'STANDARD') > 0
    THEN
        v_database := 'STANDARD';
    ELSIF INSTR( UPPER(vrec_banner.banner), 'PERSONAL') > 0
    THEN
        v_database := 'PERSONAL';
    ELSIF INSTR( UPPER(vrec_banner.banner), 'ENTERPRISE') > 0
    THEN
        v_database := 'ENTERPRISE';
    ELSE
        v_database := 'UNKNOWN';
    END IF;

    RETURN v_database;
EXCEPTION
    WHEN OTHERS
    THEN
        RETURN 'ERROR:' || SQLERRM(SQLCODE);
END fn_which_edition; -- function fn_which_edition
/

Done.

Comments

-1

In addition to the answer from user3362908. If your instance is down you may use following:

$ORACLE_HOME/bin/sqlplus -V

2 Comments

That shows the version of sqlplus, not the database.
@elmicha. If you read original question you won't find the question about the database version but about Oracle (maybe database, maybe software): "what version of Oracle they are running".

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.