Como posso confirmar que um banco de dados é Oracle e qual versão está usando SQL?

165

Estou construindo um instalador para um aplicativo. O usuário seleciona uma fonte de dados que configurou e nomeia o tipo de banco de dados que é. Quero confirmar que o tipo de banco de dados é realmente Oracle e, se possível, qual versão do Oracle eles estão executando, enviando uma instrução SQL para a fonte de dados.

modius
fonte
E a sua linguagem de programação? Esse tipo de pergunta realmente depende da API do idioma para o acesso ao banco de dados.
Gizmo
Posso assumir que tenho uma fonte de dados JDBC. Se a conexão falhar ou se a instrução sql gerar um erro, certamente posso interceptar isso e tratá-lo adequadamente.
Modius 19/09/08

Respostas:

286

Execute este SQL:

select * from v$version;

E você obterá um resultado como:

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
Tony Andrews
fonte
2
Todas as versões do Oracle que eu já usei. Não posso falar pelo Oracle 5.0 e antes!
21413 Tony Tonys
1
Essa técnica falhou para mim no Oracle 11.2.0.2.0, mas estou tendo alguns problemas de permissão de login. No entanto, para aqueles que possam estar no mesmo barco que eu, a segunda técnica mencionados nesta página por Lawrence fez trabalho: SELECT * FROM product_component_version
sugardaddy
1
Não funciona se você não tiver permissão para v $ views. A resposta de Lawrence tem uma resposta para isso
JumpingJezza 9/16
@TonyAndrews: Como é a saída quando selecione * da versão v $; falha?
Atmesh Mishra
@AtmeshMishra: Não tenho certeza - talvez ORA-00942: table or view does not exist? O que você ganha?
Tony Andrews
46

Dois métodos:

select * from v$version;

Darei à você:

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

OU Identificando sua versão do software de banco de dados Oracle :

select * from product_component_version;

Darei à você:

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
Lawrence
fonte
ótimo ... eu precisava de product_component_version .. como eu não tinha acesso a v $ views #
ShoeLace #
Essa segunda consulta é muito mais adequada para verificação automática, pois requer a definição de um formato de dados, em vez de depender da análise ad-hoc. Obrigado por publicar!
jpaugh
29
SQL> SELECT version FROM v$instance;
VERSION
-----------------
11.2.0.3.0
Ugur
fonte
1
Melhor resposta, uma vez que apenas fornece o número da versão, portanto, não é necessário analisar a saída para extrair a versão em um script automatizado.
Pseudocode
@omeinush Funciona perfeitamente comigo (11.2.0.3).
colapsar
@tjati Parece depender não da versão, mas das permissões do usuário. V$INSTANCEaparentemente não está disponível globalmente por padrão.
Jpmc26 21/09/19
7

Você pode usar

SELECT * FROM v$version;

ou

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

se você não deseja analisar a saída da versão v $.

Peter Lang
fonte
3

Se sua instância estiver inativa, procure informações da versão em alert.log

Ou outra maneira grosseira é procurar no binário Oracle: se o banco de dados estiver hospedado no Linux, tente seqüências de caracteres no binário Oracle.

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

Para uso do Oracle:

Select * from v$version;

Para uso do servidor SQL:

Select @@VERSION as Version

e para o uso do MySQL:

Show variables LIKE "%version%";
Jack
fonte
0

A seguinte instrução SQL:

select edition,version from v$instance

retorna:

  • edição do banco de dados, por exemplo. "XE"
  • versão do banco de dados, por exemplo. "12.1.0.2.0"

(é claro que é necessário selecionar privilégios na visualização da instância v $)

Pancho
fonte
0

Podemos usar os métodos abaixo para obter a versão Number of Oracle.

Método no: 1

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

Método no: 2

SQL> select *
  2  from v$version;
Lova Chittumuri
fonte
-2

Aqui está uma função simples:

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
/

Feito.

user2460369
fonte