Die sql
-Task von ant bringt eine Menge Attribute, Properties und die Fahigkeit mit, Filesets zu verarbeiten. Damit sollte es möglich sein, PL/SQL-Dateien (und natürlich auch alle möglichen anderen Objekte wie Tabellen, Views, Indexe, Java-Klassen – allgemeiner: DDL-Scripte von Data Definition Language) in die Datenbank zu laden (bzw. die entsprechenden create, alter und drop-Operationen auszuführen).
Grundsätzlich sollte also folgender ant-Schnipsel reichen, um eine Reihe von Dateien in die Datenbank zu bekommen:
[xml]
<sql driver="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@my.db.server:1521:mydb"
userid="me"
password="my_password"
delimiter="/"
delimitertype="row"
keepformat="true">
<path>
<fileset dir="${user.dir}" includes="**.sql,**/*.plsql"/>
</path>
</sql>
[/xml]
Die drei letzten Attribute haben folgende Funktion:
- delimiter: das ist normalerweise das Semikolon „;“. Für PL/SQL geht der Default natürlich nicht, darüber hinaus ist der einzelne Slash bei Oracle sehr gebräuchlich.
- delimitertype: der Wert „row“ führt dazu, dass nur die allein auf einer eigenen Zeile stehenden Slashies als Trenner zwischen SQL-Anweisungen erkannt werden.
- keepformat: damit wird verhindert, dass die sql-Task Zeilenenden und Einrückungen auf einzelne Leerzeichen verkürzt (was PL/SQL-Code auf eine laaaange Zeile bringen würde).
Für Leute, die ihre eigenen ant-Scripte bauen, kann das Snippet als Ausgangspunkt genutzt werden. Allerdings hat es ein paar Haken:
- Die Reihenfolge, mit der sql- und plsql-Dateien geladen werden, ist unbestimmt. Die technischen Abhängigkeiten (Prozedur X ruft Funktion Y und schreibt Tabelle Z) werden dabei nicht oder nicht vollständig eingehalten.
Anmerkung: ab ant 1.7 gib es diverse Resource Collections und darin speziell sort (nach name, date, type …). Damit kann das Reihenfolge-Problem zusammen mit einer passende Namensgebung gelöst werden – man könnte z. B. eine Reihenfolge-Zahl an den Anfang der Dateinamen setzen, z. B. 001.log_table.sql und 002.log_clob_table.sql, 101.log_header.plsql, 102.log_body.plsql. Etwas gewöhnungsbedürftig und sicher in vielen Fällen nicht praktikabel. - Während die sql-Task Fehler in „normalen“ DDL-Anweisungen anzeigt, werden PL/SQL-Compile-Fehler „geschluckt“ (die Task weiß ja nicht, ob eine Datei PL/SQL, Java oder Views enthält und führt auch keine Query auf user_errors aus).
Ein entsprechendes select auf user_errors hilft dagegen, besonders wenn die zu ladenden Artefakte im Buildfile bekannt sind. - Falls mehrere (ant-)Projekte Dateien in die Datenbank laden und dort ausführen wollen, muss das Snippet immer wieder kopiert werden. Abhilfe dafür schaffen verschiedene Dinge: Aufruf eines zentralen Build-Files über die ant-Task ant, include einer solchen zentralen Datei oder die Implementation eigener Ant-Tasks, die per Java-Archiv zur Verfügung gestellt werden