ฉันจะยืนยันฐานข้อมูลเป็น Oracle & รุ่นใดที่ใช้ SQL อยู่?


165

ฉันกำลังสร้างตัวติดตั้งสำหรับแอปพลิเคชัน ผู้ใช้จะได้รับเลือกแหล่งข้อมูลที่กำหนดค่าและระบุประเภทของฐานข้อมูล ฉันต้องการยืนยันว่าประเภทฐานข้อมูลนั้นเป็น Oracle จริง ๆ และถ้าเป็นไปได้ Oracle รุ่นใดที่พวกเขากำลังทำงานอยู่โดยส่งคำสั่ง SQL ไปยังแหล่งข้อมูล


แล้วภาษาโปรแกรมของคุณล่ะ? คำถามประเภทนี้ขึ้นอยู่กับ API ภาษาสำหรับการเข้าถึงฐานข้อมูล
gizmo

ฉันสามารถสมมติว่าฉันมีแหล่งข้อมูล 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 ได้ทำงาน: เลือก * จาก product_component_version
sugardaddy

1
ไม่ทำงานหากคุณไม่ได้รับอนุญาตให้ใช้ v $ views คำตอบของลอเรนซ์มีคำตอบสำหรับสิ่งนั้น
JumpingJezza

@TonyAndrews: เอาต์พุตเป็นอย่างไรเมื่อเลือก * จาก 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

ยอดเยี่ยม ... ฉันต้องการ product_component_version .. เนื่องจากฉันไม่สามารถเข้าถึง v $ views
ShoeLace

แบบสอบถามที่สองนั้นเหมาะสมกว่าสำหรับการตรวจสอบอัตโนมัติเนื่องจากต้องการกำหนดรูปแบบข้อมูลแทนที่จะใช้การแยกวิเคราะห์เฉพาะกิจ ขอบคุณสำหรับการโพสต์!
jpaugh

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

1
คำตอบที่ดีที่สุดเพราะจะให้เฉพาะหมายเลขรุ่นเท่านั้นดังนั้นจึงไม่จำเป็นต้องแยกวิเคราะห์ผลลัพธ์เพื่อแยกเวอร์ชันในสคริปต์อัตโนมัติ
pseudocode

@omeinush ทำงานได้อย่างสมบูรณ์แบบกับฉัน (11.2.0.3)
collapsar

@tjati ดูเหมือนว่าจะไม่ได้ขึ้นอยู่กับรุ่น แต่ขึ้นอยู่กับการอนุญาตของผู้ใช้ V$INSTANCEดูเหมือนจะไม่สามารถใช้งานได้ทั่วโลกตามค่าเริ่มต้น
jpmc26


3

หากอินสแตนซ์ของคุณไม่ทำงานคุณกำลังค้นหาข้อมูลรุ่นใน alert.log

หรือวิธีหยาบคายอีกวิธีคือค้นหาไบนารีของ Oracle หากฐานข้อมูลในโฮสต์บน Linux ให้ลองใช้สตริงบนฐานข้อมูล 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.