Zu Oracle

Bereich:
Versionsinfo:
DBA
9.2, 10.2, 11.1
Erstellung:
Letzte Überarbeitung:
05/2004 MP
06/2009 EF
 Als PDF Downloaden!

TNSNAMES.ORA Inhalt in SQL*Plus anzeigen

Wer hat nicht schon einmal in SQL*Plus verzweifelt den Alias-Namen gesucht, um auf eine andere Datenbank zu gelangen?

In den Oracle-Versionen 10 und 11 geht dies über das folgende kleine Skript. Das Oracle-Home-Verzeichnis kann über die Prozedur dbms_system.get_env ermittelt werden. 
Wenn man den Pfad des ORACLE_HOME ermittelt hat, kann man die Datei über ein BFILE einlesen.
Danach werden die unnötigen Zeichen entfernt und die Datei TNSNAMES.ORA ausgegeben.

DECLARE
  v_bfile BFILE;
  v_last        NUMBER:=1;
  v_current     NUMBER;
  v_current_row VARCHAR2(4000);
  v_home        VARCHAR2(512);
BEGIN
  dbms_system.get_env('ORACLE_HOME',v_home);
  EXECUTE IMMEDIATE q'#CREATE OR REPLACE DIRECTORY network_dir AS '#'||v_home||q'#\NETWORK\ADMIN'#';
  v_last  :=1;
  v_bfile := bfilename( 'NETWORK_DIR', 'tnsnames.ora' );
  dbms_lob.fileopen( v_bfile );
  LOOP
    v_current := dbms_lob.instr( v_bfile, '0A', v_last, 1 );
    EXIT WHEN (NVL(v_current,0) = 0);
    v_current_row := REPLACE(REPLACE(utl_raw.cast_to_varchar2(dbms_lob.substr( v_bfile, v_current-v_last+1, v_last)),CHR(10),''),CHR(13),'');
    dbms_output.put_line(v_current_row);
    v_last := v_current+1;
  END LOOP;
  dbms_lob.fileclose(v_bfile);
EXCEPTION
WHEN OTHERS THEN
  dbms_output.put_line(sqlerrm);
END;
/

Ausgabe:

# tnsnames.ora Network Configuration File: D:\oracle\product\10.1.0\Db_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.
O10G =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hanibal)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = o10g)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)

In einem weiteren Schritt könnte man nun zum Beispiel die Alias-Namen aus der Datei extrahieren und aus diesen Namen automatisch Database Links erzeugen.

In Oracle 9 muss man etwas weiter ausholen und die Registry auslesen, um das Oracle Home zu ermitteln.

Der Befehl  SQL> @.[%ORACLE_HOME%] liefert folgende Zeile zurück:

SP2-0310: unable to open file ".[D:\oracle\product\10.1.0\Db_1].sql"

Die Fehlermeldung muss eigentlich nur gefiltert werden, um das Verzeichnis ORACLE_HOME (hier D:\oracle\product\10.1.0\Db_1) zu ermitteln.
Die Ausgabe wird einfach in eine Datei umgeleitet, die man dann wieder einlesen kann.

SET SERVEROUTPUT ON FEEDBACK OFF TERMOUT OFF VERIFY OFF ECHO OFF
COL value NEW_VALUE dest
SELECT value FROM v$parameter
WHERE name='user_dump_dest';
CREATE OR REPLACE DIRECTORY USER_DUMP_DEST AS '&&dest';

SPOOL &&dest\var.tmp
@.[%ORACLE_HOME%]
PROMPT ENDE
SPOOL OFF

SET TERMOUT ON SERVEROUTPUT ON

DECLARE
  v_bfile BFILE;
  v_last        NUMBER:=1;
  v_current     NUMBER;
  v_current_row VARCHAR2(4000);
BEGIN
  v_bfile := bfilename( 'USER_DUMP_DEST', 'var.tmp' );
  dbms_lob.fileopen( v_bfile );
  LOOP
    v_current := dbms_lob.instr(v_bfile,'0A',v_last,dbms_lob.instr( v_bfile, '0A', v_last, 1 ));
    EXIT WHEN (NVL(v_current,0) = 0);
    v_current_row       := REPLACE(REPLACE(utl_raw.cast_to_varchar2(dbms_lob.substr( v_bfile, v_current-v_last+1, v_last)),chr(10),''),chr(13),'');
    v_current_row       := SUBSTR(v_current_row, INSTR(v_current_row,'[',1,1)+1,instr(v_current_row,']',1,1) - INSTR(v_current_row,'[',1,1)-1);
    dbms_output.put_line(v_current_row);
    EXIT;
    v_last := v_current+1;
  END LOOP;
  EXECUTE IMMEDIATE 'CREATE OR REPLACE DIRECTORY NETWORK_DIR AS '||chr(39)||v_current_row||'\NETWORK\ADMIN'||chr(39);
  v_last  :=1;
  v_bfile := bfilename( 'NETWORK_DIR', 'tnsnames.ora' );
  dbms_lob.fileopen( v_bfile );
  LOOP
    v_current := dbms_lob.instr( v_bfile, '0A', v_last, 1 );
    EXIT
  WHEN (NVL(v_current,0) = 0);
    v_current_row       := REPLACE(REPLACE(utl_raw.cast_to_varchar2(dbms_lob.substr( v_bfile, v_current-v_last+1, v_last)),chr(10),''),chr(13),'');
    dbms_output.put_line(v_current_row);
    v_last := v_current+1;
  END LOOP;
  dbms_lob.fileclose(v_bfile);
EXCEPTION
WHEN OTHERS THEN
  dbms_output.put_line(sqlerrm);
END;
/

 Weitere Informationen zu diesem und anderen Themen erhalten Sie in einem unserer DBA-Kurse.

Suche

Kontakt

Telefon:
  089 6228 6789-0

Telefon (gültig bis Ende 2010):
  089 679090-40

E-Mail Verteiler Monatstipps

Bitte nehmen Sie mich in den Verteiler der monatlichen Tipps & Tricks auf.