# Oracle 9.2i Abfrage UTL_FILE parameter (pfad, zugriffe)



## tplanitz (26. Januar 2008)

Hallo und guten Morgen,

ich probier schon einige Zeit mit einem einfachen SELECT statement die Informationen über das UTL_FILE Verzeichnis zu finden.

Einen sehr guten Beitrag zur *Verwendung* des UTL_FILE package habe ich in diesem Tutorial gefunden:
http://www.tutorials.de/forum/relat...e-oder-berichte-direkt-aus-der-datenbank.html

Ich such aber eine Möglichkeit Informationen der folgenden Art zu erhalten ohne den OEM zu verwenden oder meine Admins zu befragen:
*Gesuchte Infos:*

Den Pfand zum Verzeichnis (output DIRECTORY )
Letzter Zugriff auf das Verzeichnis
Name und Zeitstempel zu der letztgeschriebenen Datei im Verzeichnis
Table Space und Speicher des Verzeichnis (Gesamt, wieviel schon belegt)


Hat jemand einen Rat wie man an diese Informationen kommen kann?

Vielen Dank für Hilfe


----------



## Exceptionfault (28. Januar 2008)

Den Pfad zu einem Verzeichnis ist einfach. Schau hier einfach mal in die Views ALL_DIRECTORIES
oder DBA_DIRECTORIES. Da finset du den Namen des Verzeichnis Objekts und den lokalen Pfad auf den das
Verzeichnis verweist.

Tablespace und Speicher versteh ich nicht ganz, oder ist Tablespace hier vielleicht das falsche Wort.
Ein Tablespace in Oracle ist eine logische Gruppe von Datenbankfiles. Deine Dateien, die mit UTL_FILE
geschrieben werden liegen allerdings ausserhalb der Datenbank und haben somit nichts mit Tablespaces 
zu tun.

Alle anderen Punkte lassen sich mit PL/SQL leider nicht abfragen, mit UTL_FILE schon gar nicht. 
Allerdings habe ich mal was ähnliches gesucht und es dann mit einer JAVA Stored Procedure in der
Datenbank gelöst. Bin mir nicht sicher, ob der Code so noch funktioniert, ist schon ein bisschen 
älter... könnte auch sein, dass noch ein oder zwei Rechte für den Benutzer nötig sind...
Ziel war es auf jeden Fall alle Dateien, die in einem Verzeichnis des DB Servers lagen abzufragen
und einzulesen. Hierfür habe ich einen DIR Befehl gebraucht:


```
CREATE DIRECTORY DOC_IMPORT AS 'C:\ORACLE\SHARE\IMPORT';
GRANT READ, WRITE ON DIRECTORY DOC_IMPORT TO DOCADM;
GRANT JAVAUSERPRIV  TO DOCADM;

CREATE GLOBAL TEMPORARY TABLE DIR_LIST ( 
    FILENAME        VARCHAR2(255) 
)
ON COMMIT PRESERVE ROWS
/

CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "DirList"
AS
    import java.io.*;
    import java.sql.*;
  
    public class DirList
    {
        public static void getList(String directory)
                            throws SQLException
        {
            File path = new File( directory );
            String[] list = path.list();
            String element;
  
            for(int i = 0; i < list.length; i++)
            {
                element = list[i];
                #sql { INSERT INTO DIR_LIST (FILENAME)
                        VALUES (:element) };
            }
        }
  
    }
/

CREATE OR REPLACE PROCEDURE GET_DIR_LIST(   p_directory     IN  VARCHAR2 )
AS LANGUAGE JAVA NAME 'DirList.getList( java.lang.String )'
/
```

Der Aufruf erfolgte dann einfach mit "EXEC GET_DIR_LIST( 'C:\ORACLE\SHARE\IMPORT' );" und dann hatte
ich alle Files in der Tabelle DIR_LIST stehen. Mit "java.io.*" kannst du dann sicherlich auch deine
anderen Fragen beantworten.


----------



## tplanitz (30. Januar 2008)

Hallo Exceptionfault and ALL,

@Exceptionfault: vielen Dank für Deine wie immer kompetente Antwort, die INFO ALL_DIRECTORIES oder DBA_DIRECTORIES ist erstmal ausreichend. Die überwachung der Verzeichnisse überlasse ich der Administration da die in einem anderen Server liegen.

Was mich zu einer Frage bringt und ich hoffe Du/Ihr könnt helfen. Das folgende Programm schreibt Daten in eine Datei, unter anderem BLOB Felder. Da die Datei auf einem anderen server liegt möchte ich mir den Inhalt der Datei in einem SQL Tool oder einem Browser ansehen. Leider werden die BLOB Inhalte mit komischen Zeichen also etwa: *{.  8#.. .s.w. dargestellt. Ich hätte aber gerne den HEX - Wert in der Datei die geschrieben wird stehen also sowas wie: AF67FFE0815.
Muß man das schon beim reinschreiben UMWANDELN ? Oder beim auslesen der Datei ?
Es wäre super wenn 2 Fragen beantwortet werden:

Wie lese ich eine Datei aus einem NICHT lokalem Verzeichnis
Wie bekomme ich Hexadezimalwerte angezeigt wenn BLOB Felder in eine Datei geschrieben wurden


```
DECLARE
TYPE r_blob IS RECORD (
vblob   BLOB,
len     NUMBER
);
TYPE t_blob IS TABLE OF r_blob
INDEX BY BINARY_INTEGER;
-- Inhalt in den Cursor schreiben
CURSOR c_blob IS
SELECT 	a_blob, Dbms_Lob.getlength(a_blob) anzahl
FROM t_blob;

v_blob_daten t_blob;
i NUMBER (3) := 1;
vstart  NUMBER := 1;
bytelen NUMBER := 32000;
len     NUMBER;
my_vr   RAW(32000);
x       NUMBER;

l_output utl_file.file_type;

BEGIN
-- anzahl der zeilen
SELECT Count(*) INTO x FROM t_blob;

  -- define output directory
  l_output := utl_file.fopen('F:\UTL_FILE_DIR_9.2', 'BLOB_ROWS.TXT', 'W', 32760);
	-- tabelle füllen
OPEN c_blob;
	LOOP
		EXIT WHEN c_blob%ROWCOUNT=x;
		FETCH c_blob INTO v_blob_daten(i);
		Dbms_Output.put_line(v_blob_daten(i).len);
  -- if small enough for a single write
  IF v_blob_daten(i).len < 32760 THEN
    utl_file.put_raw(l_output,v_blob_daten(i).vblob);
		Utl_File.put(l_output, ';'||v_blob_daten(i).len );
    Utl_File.new_line(l_output);
		utl_file.fflush(l_output);
  END IF;
  i:=i+1;
	END LOOP;
	utl_file.fclose(l_output);
	--UTL_FILE.FCLOSE_ALL;
END blob2file;
/
```

Vielen Dank für Hilfe


----------

