2008-09-19 9 views
142

Je construis un installateur pour une application. L'utilisateur peut sélectionner une source de données qu'il a configurée et nommer quel type de base de données il est. Je veux confirmer que le type de base de données est en effet Oracle, et si possible, quelle version d'Oracle ils exécutent en envoyant une instruction SQL à la source de données.Comment puis-je confirmer qu'une base de données est Oracle et quelle version utilise SQL?

+0

Qu'en est votre langage de programmation? Ce genre de question dépend vraiment de l'API de langage pour l'accès DB. – gizmo

+0

Je peux supposer que j'ai une source de données JDBC. Si la connexion échoue ou si l'instruction sql génère une erreur, je peux certainement la piéger et la traiter en conséquence. – modius

Répondre

247

Exécuter ce SQL:

select * from v$version; 

Et vous obtiendrez un résultat comme:

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 
+0

Est-ce que cela fonctionne pour toutes les versions d'Oracle? – modius

+2

Toutes les versions d'Oracle que j'ai jamais utilisées. Je ne peux pas parler pour Oracle 5.0 et avant! –

+1

Cette technique a échoué pour moi sur Oracle 11.2.0.2.0, mais j'ai quelques problèmes d'autorisation de connexion. Cependant, pour ceux qui pourraient être dans le même bateau que moi, la deuxième technique mentionnée sur cette page par Lawrence a fonctionné: select * from product_component_version – sugardaddy

7

Vous pouvez utiliser

SELECT * FROM v$version; 

ou

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

si vous ne voulez pas analyser la sortie de la version v $.

40

Deux méthodes:

select * from v$version; 

vous donnera:

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 Identifying Your Oracle Database Software Release:

select * from product_component_version; 

vous donnera:

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 
+0

super ... j'avais besoin de product_component_version .. comme je n'avais pas accès aux vues v $ – ShoeLace

+0

Cette deuxième requête est bien plus adaptée à la vérification automatique, car elle nécessite de définir un format de données, plutôt que de s'appuyer sur l'analyse ad-hoc. Merci d'avoir posté! – jpaugh

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

Meilleure réponse car elle ne donne que le numéro de version, donc pas besoin d'analyser la sortie pour extraire la version dans un script automatisé. – pseudocode

+0

Ne fonctionne pas avec Oracle 11g. – tjati

+0

@omeinush Fonctionne parfaitement avec moi (11.2.0.3). – collapsar

1

Si vous avez des privilèges, vous pouvez utiliser ci-dessous VIEW ou V$VERSION:

SELECT VERSION FROM V$INSTANCE; 
+2

Je ne suis pas l'électeur abattu, mais je vois une réponse plus ancienne en double ... qui peut être la raison du vote négatif. –

-2

Voici une fonction simple:

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 
/

Terminé.

3

Si votre instance est en panne, vous êtes regard des informations de version dans alert.log

Ou une autre façon brute est de regarder en binaire Oracle, Si DB hébergé sur Linux, essayez les chaînes sur binaire Oracle.

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

Pour utiliser Oracle:

Select * from v$version; 

Pour une utilisation du serveur SQL:

Select @@VERSION as Version 

et pour MySQL:

Show variables LIKE "%version%"; 
Questions connexes