31. Juli 2007

Verzeichnisinhalte anzeigen ... mit SQL!

Heute hatte ich eine interessante Frage:Wie kann die Dateiliste eines Verzeichnisses (auf dem Server) mit SQL selektieren?
Da PL/SQL-Pakete wie UTL_FILE dazu keine Unterstützung anbieten, liegt, wie beim Ausführen von Betriebssystem-Kommandos aus der Datenbank die Nutzung von Java in der Datenbank nahe. Das folgende Skript legt eine Java-Klasse und eine PL/SQL-Funktion GET_FILE_LIST an.
drop type varchar2_array
/

create or replace java source named "FileHelper" as
import java.io.*;
import oracle.jdbc.*;
import oracle.sql.*;
import java.sql.*;

public class FileHelper {
  public static ARRAY getFileList(String sDirName) throws Exception{
    Connection con = DriverManager.getConnection("jdbc:default:connection:");
    ArrayDescriptor descr = ArrayDescriptor.createDescriptor("VARCHAR2_ARRAY", con);

    File f = new File(sDirName);
    String[] sFileList = f.list();
    return new ARRAY(descr, con, sFileList);
  }
}
/

alter java source "FileHelper" compile
/

create type VARCHAR2_ARRAY as table of VARCHAR2(4000)
/

create or replace function get_file_list(p_directory in varchar2) return VARCHAR2_ARRAY
  is language java name 'FileHelper.getFileList(java.lang.String) return oracle.sql.ARRAY';
/
Eine Dateiliste kann man sich nun ganz einfach anzeigen mit ...
select * from table(get_file_list('/'))
/

COLUMN_VALUE
---------------------------------------
lost+found
ds
export
var
usr
bin
:
Damit das funktioniert, benötigt der aufrufende Datenbankuser allerdings noch einige Java-Spezifische Privilegien erforderlich. Um ein bestimmtes Verzeichnis freizugeben (bspw. "/") muss als User SYS folgender Call abgesetzt werden.
begin 
  dbms_java.grant_permission( '[DB-Schema]', 'SYS:java.io.FilePermission', '/','read');
end;
/
Im PL/SQL-Paket zur Interaktion mit dem Betriebssystem findet Ihr eine vollständige Implementierung; die darin enthaltene Funktion FILE_PKG.GET_FILE_LIST listet neben den reinen Dateinamen auch die Attribute und erlaubt darüber hinaus auch Aktionen mit den einzelnen Dateien wie Auslesen, Hineinschreiben und vieles mehr ...

Keine Kommentare:

Beliebte Postings