데이터베이스가 Oracle인지 확인하고 SQL을 사용하는 버전은 무엇입니까?


165

응용 프로그램의 설치 프로그램을 작성 중입니다. 사용자는 구성한 데이터 소스를 선택하고 데이터베이스 유형을 지정합니다. 데이터베이스 유형이 실제로 Oracle인지 확인하고 가능한 경우 SQL 문을 데이터 소스에 전송하여 실행중인 Oracle 버전을 확인하고 싶습니다.


프로그래밍 언어는 어떻습니까? 이런 종류의 질문은 실제로 DB 액세스를위한 언어 API에 달려 있습니다.
기즈모

JDBC 데이터 소스가 있다고 가정 할 수 있습니다. 연결이 실패하거나 SQL 문이 생성되어 오류가 발생하면 확실하게 트랩하여 처리 할 수 ​​있습니다.
modius

답변:


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 및 그 이전에는 말할 수 없습니다!
Tony Andrews

1
이 기술은 Oracle 11.2.0.2.0에서 실패했지만 로그인 권한 문제가 있습니다. 그러나 나와 같은 보트에있을 수있는 사람들을 위해 Lawrence 가이 페이지에서 언급 한 두 번째 기술은 효과가
sugardaddy

1
v $ views에 대한 권한이 없으면 작동하지 않습니다. 로렌스의 답변 에 대한 답변이 있습니다
JumpingJezza

@TonyAndrews : select * from v $ version;과 같은 결과는 무엇입니까? 실패?
Atmesh Mishra

@ AtmeshMishra : 확실하지 않습니다-아마도 ORA-00942: table or view does not exist? 무엇을 얻습니까?
Tony Andrews

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

좋아요 ...
v_view에

이 두 번째 쿼리는 임시 구문 분석에 의존하기보다는 데이터 형식을 정의해야하기 때문에 자동 검사에 훨씬 적합합니다. 게시 해 주셔서 감사합니다!
jpaugh

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

1
가장 좋은 대답은 버전 번호 만 제공하므로 자동화 된 스크립트에서 버전을 추출하기 위해 출력을 구문 분석 할 필요가 없습니다.
의사 코드

@omeinush 나와 완벽하게 작동합니다 (11.2.0.3).
collapsar 2016 년

@tjati 버전이 아니라 사용자 권한에 의존하는 것으로 보입니다. V$INSTANCE기본적으로 전역 적으로 사용할 수 없습니다.
jpmc26

7

둘 중 하나를 사용할 수 있습니다

SELECT * FROM v$version;

또는

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

v $ version의 출력을 구문 분석하지 않으려면


3

인스턴스가 다운되면 alert.log에서 버전 정보를 찾습니다.

또는 또 다른 조잡한 방법은 Oracle 바이너리를 살펴 보는 것입니다. Linux에서 DB를 호스팅하는 경우 Oracle 바이너리에서 문자열을 사용해보십시오.

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

1

Oracle의 경우 :

Select * from v$version;

SQL 서버의 경우 :

Select @@VERSION as Version

MySQL 사용의 경우 :

Show variables LIKE "%version%";

0

다음 SQL 문 :

select edition,version from v$instance

보고:

  • 데이터베이스 판 예. "XE"
  • 데이터베이스 버전. "12.1.0.2.0"

(v $ 인스턴스보기에 대한 선택 권한은 물론 필요합니다)


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
/

끝난.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.