如何确认数据库是Oracle以及使用SQL的数据库是哪个版本?


165

我正在为应用程序构建安装程序。用户可以选择他们已经配置的数据源,并指定它是哪种数据库。我想通过将SQL语句发送到数据源来确认数据库类型确实是Oracle,并且如果可能的话,确认它们正在运行的Oracle版本。


那你的编程语言呢?这种问题确实取决于用于数据库访问的语言API。
gizmo

我可以假设我有一个JDBC数据源。如果连接失败,或者sql语句生成错误,那么我当然可以将其捕获并进行相应处理。
modius

Answers:


286

运行以下SQL:

select * from v$version;

您将得到类似的结果:

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

2
我曾经使用过的所有Oracle版本。我不能说Oracle 5.0和以前的版本!
托尼·安德鲁斯

1
在Oracle 11.2.0.2.0上,这项技术对我来说失败了,但是我遇到了一些登录权限问题。但是,对于那些可能与我同舟共济的人,劳伦斯在本页上提到的第二种技术确实起作用了:select * from product_component_version
sugardaddy 2015年

1
如果您没有v $ views的权限,则无法使用。劳伦斯(Lawrence)的答案就是答案
JumpingJezza '16

@TonyAndrews:从v $ version中选择*时的输出是什么?失败了吗?
Atmesh Mishra'7

@AtmeshMishra:我不确定-也许ORA-00942: table or view does not exist吗?你得到了什么?
托尼·安德鲁斯

46

两种方法:

select * from v$version;

会给你:

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

标识您的Oracle数据库软件版本

select * from product_component_version;

会给你:

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

太棒了...我需要product_component_version ..因为我无法访问v $视图
ShoeLace 2014年

第二个查询更适合自动检查,因为它需要定义一种数据格式,而不是依赖于即席解析。感谢您的发布!
jpaugh

29
SQL> SELECT version FROM v$instance;
VERSION
-----------------
11.2.0.3.0

1
最佳答案,因为它仅提供版本号,因此无需解析输出即可在自动脚本中提取版本。
2013年

@omeinush与我完美配合(11.2.0.3)。
collapsar

@tjati它似乎不取决于版本,而是取决于用户权限。V$INSTANCE默认情况下显然不是全局可用的。
jpmc26 '18

7

您可以使用

SELECT * FROM v$version;

要么

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

如果您不想解析v $ version的输出。


3

如果您的实例关闭,则需要在alert.log中查找版本信息

或另一种粗略的方法是研究Oracle二进制文件。如果DB in Linux托管在Linux上,请尝试Oracle二进制文件上的字符串。

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

1

对于Oracle使用:

Select * from v$version;

对于SQL Server使用:

Select @@VERSION as Version

对于MySQL使用:

Show variables LIKE "%version%";

0

以下SQL语句:

select edition,version from v$instance

返回:

  • 数据库版本,例如 “ XE”
  • 数据库版本,例如 “ 12.1.0.2.0”

(当然必须在v $ instance视图上选择特权)


0

我们可以使用以下方法获取Oracle的版本号。

方法编号:1

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

方法编号:2

SQL> select *
  2  from v$version;

-2

这是一个简单的函数:

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
/

做完了

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.