UTL_TEXT inkl. CodeGenerator

UTL_TEXT ist nicht nur eine Sammlung von Textutilities, sondern enthält auch einen leistungsfähigen CodeGenerator mit einem besonderen Programmieransatz.

Keimzelle dieses Ansatzes ist eine BULK_REPLACE-Methode, die es erlaubt, mehrere Textanker durch Ersetzungszeichenfolgen zu ersetzen. Im einfachsten Fall werden die zu transformierende Zeichenfolge mit Ersetzungsankern, sowie eine Instant vom Type CHAR_TABLE mit beliebig vielen Anker - Ersetzungszeichenfolge - Paaren übergeben.

Der CodeGenerator hebt dies auf den nächsten Level, indem kein Template und eine CHAR_TABLE-Instanz, sondern ein geöffneter Cursor übergeben wird. Der Cursor enthält eine Spalte TEMPLATE mit dem Template sowie eine beliebige Anzahl Spalten mit Werten. Die Anker des Templates entsprechen den Spaltenbezeichnern des Cursors. Wird für einen Anker eine entsprechende Spalte gefunden, so wird deren Spaltenwert ersetzt.

Die Cursoren können eine oder mehrere Zeilen enthalten. Der CodeGenerator kann hieraus entweder ein einziges CLOB oder eine Liste von CLOB (ein CLOB pro Zeile des Cursors) erzeugen. Das Besondere dieser Implementierung besteht darin, dass durch diesen Ansatz die Templates über eine separate Tabelle zugejoint werden können. So kann jede Zeile des Cursors ein passendes Template referenzieren. Mit Hilfe dieses »Tricks« entstehen mächtige Möglichkeiten. So könnte ein Cursor zum Beispiel Metadaten einer Tabelle enthalten. Auf Grund des Datentyps der Spalte kann nun ein Template referenziert werden, dass zur Erzeugung einer passenden DDL-Anweisung verwendet werden kann. Es entstehen DDL-Generatoren mit minimalen Kodierungsaufwand und maximaler Flexibilität.

Ein weiteres Feature des CodeGenerators ist seine Fähigkeit, pro Ersetzungsanker mehrere Angaben zu hinterlegen. So kann ein Präfix und ein Postfix für den Fall, dass der Ersetzungswert nicht NULL ist ebenso hinterlegt werden wie ein Ersatzwert für den Fall, dass der Ersetzungswert NULL ist. Ein Ersetzungsanker der Form

#SPALTE|PRE|POST|IFNULL#

gibt entweder

PRE<Spaltenwert>POST

aus, falls der Spaltenwert nicht NULL ist, oder

IFNULL

, falls der Spaltenwert NULL war. Durch diese Möglichkeiten, kombiniert mit der Mächtigkeit von SQL, lassen sich beinahe alle Situationen lösen, auf die ein CodeGenerator stoßen kann.

Da der CodeGenerator als Funktion oder als Prozedur verwendet werden kann, ist es einfach möglich, den Aufruf des Generators auf mehreren hierarchischen Stufen auszuführen. Alternativ können hierarchische Gruppierung vorab berechnet und als Variable in weiteren CodeGenerator-Aufrufen eingebettet werden. Selbst komplexe Ergebnisse sind so möglich.