single.php
< Beitrag von Frank Winter

Mit einer PL/SQL-Funktion SQL-Statements generieren

Jeder Oracle-Datenbank-Entwickler wird vermutlich im Laufe der Jahre das ein oder andere Helfer-Skript gebaut haben, das ihm die tägliche Arbeit etwas erleichtert. Dies können PL/SQL-Funktionen oder Prozeduren sein, die universell und damit in verschiedenen Projekten einsetzbar sind, Skripte, die bei der Analyse von Problemen helfen, oder Skripte, die einem eher stupide Tipp-Tätigkeiten abnehmen.

Genau für letzteren Anwendungsfall habe ich schon vor Jahren die kleine PL/SQL-Funktion GEN_SQL geschrieben, die zu einer gegebenen Datenbank-Tabelle verschiedene Arten von SQL-Statements generiert.

Die PL/SQL-Funktion GEN_SQL

Der Funktion GEN_SQL übergibt man als ersten Parameter den Namen einer Tabelle aus dem gleichen Datenbankschema und als zweiten Parameter die Art des zu generierenden SQL-Statements.

Folgende Werte sind für diesen zweiten Parameter möglich:

Parameterwert Beschreibung
S Funktion generiert ein Select-Statement zu einer Tabelle
U Funktion generiert ein Update-Statement zu einer Tabelle, inkl. Where-Klausel, bei der auf einen Primary Key (falls vorhanden) eingeschränkt wird
I Funktion generiert ein Insert-Statement zu einer Tabelle
M Funktion generiert ein Merge-Statement zu einer Tabelle, inkl. ON-Klausel, bei der der Primary Key (falls vorhanden) verwendet wird
C Funktion generiert kein SQL-Statement sondern eine simple kommaseparierte Liste der Spaltennamen einer Tabelle. Diese ist der Default-Wert

Die Funktion GEN_SQL sieht wie folgt aus:

Anwendungsbeispiele für GEN_SQL

Nachfolgend ein paar Anwendungsbeispiele für den Einsatz der Funktion GEN_SQL.

Um einfach nur die Spalten-Liste der in den folgenden Beispielen verwendeten Tabelle EMPLOYEES zu erhalten, ruft man die Funktion wie folgt auf:

Als Ergebnis erhält man schlicht eine kommaseparierte Liste der Tabellenspalten, sortiert nach ihrer Position in der Tabelle. Das Ergebnis der obigen Abfrage sieht somit folgendermaßen aus:

Um ein einfaches Select-Statement für eine Tabelle zu generieren, ruft man die Funktion mit dem Parameter „S“ auf:

Der Rückgabewert der Funktion ist in diesem Beispiel folgendes Select-Statement:

Soll ein Update-Statement für eine Tabelle erzeugt werden, wird die Funktion mit dem Parameter „U“ aufgerufen:

Der Ergebniswert besteht aus folgendem Update-Statement:

Generierung eines einfachen Insert-Statements

Dieses generierte Update-Statement arbeitet mit einem Alias namens „r“ als Namen für einen beliebigen PL/SQL-Record. Ich hatte dies in der Vergangenheit benötigt, da ich die betroffenen Tabellen oft mit Werten aus einem Record upgedatet hatte. Wenn man dies nicht wünscht, lässt sich das Skript an dieser Stelle natürlich leicht anpassen.

Um ein einfaches Insert-Statement zu generieren, ruft man die Funktion mit dem Parameter „I“ auf:

Der Rückgabewert der Funktion ist folgendes Insert-Statement:

Auch dieses generierte Statement arbeitet mit einem Alias namens „r“ (s. o.).

Generierung eines Merge-Statements

Die meiste lästige Tipparbeit hat man im Allgemeinen bei dem Erstellen eines Merge-Befehls. Hier daher der beispielhafte Aufruf für die Generierung eines Merge-Befehls:

Der Ergebniswert besteht in dem Beispiel aus folgendem Statement:

Das generierte Merge-Statement ist jedenfalls noch anzupassen. Zum einen darf der Update-Teil nicht den Key updaten, der in der ON-Klausel verwendet wird. Dieser Teil des Updates ist zu entfernen (im obigen Beispiel also der Teil „t.EMPLOYEE_ID = r.EMPLOYEE_ID, „).

Zum anderen kann man davon ausgehen, dass das Select-Statement in der USING-Klausel so nur bedingt sinnvoll ist, da auf diese Weise in die Tabelle Werte aus sich selbst gemerget werden. Funktionieren wird es, dürfte in der Praxis aber selten vorkommen. Welches Select-Statement in der USING-Klausel enthalten sein soll, ist automatisch aber nicht ermittelbar. Daher ist dieser Teil für eine nachträgliche Änderung vorgesehen.

Fazit

Letztlich gilt für alle obigen Anwendungsbeispiele, dass man mit der Verwendung der GEN_SQL-Funktion ein brauchbares Grundgerüst für ein SQL-Statement erhält, das aber im Einzelfall an die eigenen Wünsche anzupassen ist. Ob dies manuell oder im Rahmen eigenen PL/SQL-Codes geschieht, in den diese Funktion integriert wird, bleibt jedem Entwickler selber überlassen.

Folgen
X

Folgen

E-mail : *
Kategorie: Oracle-Development | Schlagwörter: , , , , , , | Kommentare: 0

Beitrag kommentieren

CAPTCHA * Time limit is exhausted. Please reload CAPTCHA.