【问题标题】:How can I confirm a database is Oracle & what version it is using SQL?如何确认数据库是 Oracle 以及它使用 SQL 的版本?
【发布时间】:2010-09-11 04:47:26
【问题描述】:

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

【问题讨论】:

  • 你的编程语言怎么样?这种问题实际上取决于数据库访问的语言 API。
  • 我可以假设我有一个 JDBC 数据源。如果连接失败,或者 sql 语句生成并出错,那么我当然可以捕获它并相应地处理它。

标签: sql oracle


【解决方案1】:

运行此 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

【讨论】:

  • 我用过的所有版本的Oracle。我不能代表 Oracle 5.0 及之前的版本!
  • 这项技术在 Oracle 11.2.0.2.0 上对我来说失败了,但我遇到了一些登录权限问题。然而,对于那些可能和我一样的人,劳伦斯在本页提到的第二种技术确实有效:select * from product_component_version
  • 如果您没有 v$views 的权限,则不起作用。 Lawrence's answer 有答案
  • @TonyAndrews: select * from v$version 时的输出是什么?失败了?
  • @AtmeshMishra:我不确定——也许是ORA-00942: table or view does not exist?你得到了什么?
【解决方案2】:

你可以使用

SELECT * FROM v$version;

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

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

【讨论】:

    【解决方案3】:

    两种方法:

    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
    

    Identifying Your Oracle Database Software Release:

    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$ 视图
    • 第二个查询更适合自动检查,因为它需要定义数据格式,而不是依赖临时解析。感谢发帖!
    【解决方案4】:
    SQL> SELECT version FROM v$instance;
    VERSION
    -----------------
    11.2.0.3.0
    

    【讨论】:

    • 最佳答案,因为它只提供版本号,因此无需解析输出以在自动脚本中提取版本。
    • @omeinush 非常适合我(11.2.0.3)。
    • @tjati 它似乎不依赖于版本,而是依赖于用户权限。 V$INSTANCE 默认情况下显然不是全局可用的。
    • 它不适用于 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
    • 需要 dba 权限。
    【解决方案5】:

    这是一个简单的函数:

    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
    /
    

    完成。

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        【解决方案7】:

        供甲骨文使用:

        Select * from v$version;
        

        用于 SQL 服务器:

        Select @@VERSION as Version
        

        对于 MySQL 使用:

        Show variables LIKE "%version%";
        

        【讨论】:

          【解决方案8】:

          以下SQL语句:

          select edition,version from v$instance
          

          返回:

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

          (当然需要在 v$instance 视图上选择权限)

          【讨论】:

          • @Prokhozhii - 我们现在使用 19,所以我无法再确认,但如果您能提供额外的解释,我将不胜感激,因为从 v$instance 中选择版本肯定适用于 Oracle 11。请参阅上面的答案stackoverflow.com/a/8135737/3051627。 (您是否 100% 确定用户有权访问您数据库上的 v$instance?)
          • SQL> select edition,version from v$instance; select edition,version from v$instance * ERROR at line 1: ORA-00904: "EDITION": invalid identifier
          【解决方案9】:

          我们可以使用以下方法获取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;
          

          【讨论】:

            【解决方案10】:

            这将从 Oracle 10 开始工作

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

            【讨论】:

              【解决方案11】:

              检查 Oracle 数据库版本的方法有多种。最简单的方法是运行下面的 SQL 查询来检查 Oracle Version

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

              【讨论】:

                猜你喜欢
                • 2010-09-11
                • 2021-08-15
                • 2012-08-27
                • 2023-03-23
                • 1970-01-01
                • 2022-01-03
                • 1970-01-01
                • 2012-08-21
                • 2015-09-03
                相关资源
                最近更新 更多