Jul 082011
 

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

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)