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 ...