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.
Telefon:
089 6228 6789-0
Telefon (gültig bis Ende 2010):
089 679090-40
E-Mail:
› info@muniqsoft.de
Bitte nehmen Sie mich in den Verteiler der monatlichen Tipps & Tricks auf.