ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

T
Tony Andrews

运行此 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:从 v$version 中选择 * 时的输出是什么?失败?
@AtmeshMishra:我不确定 - 也许 ORA-00942: table or view does not exist?你得到了什么?
u
user272735

两种方法:

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$ 视图的权限
第二个查询更适合自动检查,因为它需要定义数据格式,而不是依赖临时解析。感谢您的发布!
U
Ugur
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 权限。
P
Peter Lang

您可以使用

SELECT * FROM v$version;

或者

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

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


u
user3362908

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

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

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

j
jpaugh

对于 Oracle 使用:

Select * from v$version;

对于 SQL 服务器使用:

Select @@VERSION as Version

对于 MySQL 使用:

Show variables LIKE "%version%";

s
santosh tiwary

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

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

P
Pancho

以下 SQL 语句:

select edition,version from v$instance

返回:

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

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

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


@Prokhozhii - 我们现在使用 19,所以我无法再确认,但如果您能提供额外的解释,我将不胜感激,因为 select version from 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
L
Lova Chittumuri

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

P
Prokhozhii

这将从 Oracle 10 开始工作

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

K
Kent Pawar

这是一个简单的函数:

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
/

完毕。