von Sharon L. Hoffman
Über den Autor
Sharon L. Hoffman (shoffman at iSeriesNetwork.com) ist technische Autorin von NEWSolutions. Sharon Hoffman ist seit 1981 auf Midrange Systemen tätig und verfügt über intensive Erfahrungen in komplexer Anwendungsentwicklung und technischer Schulung. Übersetzt und für den deutschsprachigen Markt überarbeitet von Joachim Riener.
Mit Embedded SQL lassen sich SQL-Statements in ein in anderer Sprache – gewöhnlich RPG – geschriebenes Programm einbringen. Die strategische Einbindung von SQL in RPG-Programme kann die Performance verbessern, den Code vereinfachen und gelegentlich eine Funktionalität bieten, die weder SQL noch RPG alleine abzudecken in der Lage sind.
Aus Skill-Sicht ist alles, was für den Einsatz von Embedded SQL benötigt wird, eine ausgereifte RPG-Erfahrung sowie ein grundsätzliches Verständnis der SQL Syntax. Benötigt werden überdies der DB2 Query Manager und das Lizenzprogramm SQL Development Kit für iSeries (5722-ST1). In vielen Unternehmen, die System i Entwicklungen betreiben, ist dieses Programmprodukt bereits installiert, das außerdem in einigen Versionen von i5/OS ohne zusätzliche Kosten enthalten ist. Sind diese Grundvoraussetzungen gegeben, kann begonnen werden, die Einbindung von Embedded SQL in RPG zu erkunden.
Nach grundsätzlicher Erläuterung der Konzepte und Einführung in das Arbeiten mit Cursors im ersten Teil (erschienen in NEWSolutions Ausgabe Oktober 2007) befasst sich der zweite Teil mit rationeller Dateibearbeitung, Vermeidung von Problemen und Anmerkungen zum Start eines produktiven SQL Einsatzes.
Sieben (oder siebzig) Zeilen in einem Schritt bearbeiten
Versuchen Sie einmal sich zu erinnern, wie oft Ihnen Aufgaben wie diese gestellt wurden: „Ändern Sie die Nummer des Vertriebsgebietes aller Kunden in Kalifornien, Nevada, Arizona und New Mexico auf 27 ab.“ Gleichgültig, ob es sich nun um eine einmalige Aufgabenstellung oder eine fortwährende Anforderung handelt, die Entwicklung einer Lösung für solche oder ähnlich gestaltete Aufgaben kann sich als mühsam herausstellen und der resultierende Code ist möglicherweise nicht unbedingt als effizient zu bezeichnen. Wie auch immer, mittels SQL lassen sich auf einfache Weise mit einem einzigen Statement mehrere Zeilen ändern (oder einfügen oder löschen). Kommen solche Aufgabenstellungen häufiger vor, kann man – bezogen auf das obige Beispiel anstatt einmalig ein entsprechendes SQL Statement auszuführen – ein vorbereitetes Statement in ein RPG Programm einbetten und den Benutzer z. B. den gewünschten Staat und die neue Vertriebsgebietsnummer eingeben lassen. Die gleiche Technik lässt sich anwenden, wenn beispielsweise alle Zeilen, die bestimmte Kriterien erfüllen, gelöscht werden sollten, indem einfach das Update Statement durch ein Delete Statement ersetzt wird. Wann immer die Anforderung besteht, mehrere Zeilen einer Tabelle zu ändern oder zu löschen, sollte der Einsatz von Embedded SQL in Erwägung gezogen werden.
| Code zum Artikel | |
| Load`n`go |
|
Vergleichen wir nun die in Abbildung 5 dargestellte Technik mit dem auf einem Cursor basierenden Update (Abbildung 4). Der Code in Abbildung 4 ändert bei Ausführung des Update Statements jeweils nur eine einzige Zeile, wogegen das Update Statement in Abbildung 5 bei jeder Ausführung mehrere Zeilen ändert. Sollen alle Zeilen, auf die bestimmte spezielle Kriterien zutreffen, in gleicher Weise modifiziert werden (z. B. Änderung der Verkaufsgebietsnummer auf 27), wird ein Update Statement verwendet, ohne zuvor ein Result Set zu erzeugen (Abbildung 5). Sollen hingegen mehrere Zeilen selektiert, jedoch nur einige davon verändert werden (z. B. indem einem Benutzer eine Liste zur Auswahl angeboten wird), ist es sinnvoll, zuerst das Result Set zu erzeugen und dann einen Cursor zu verwenden, um selektiv Sätze in der basierenden Datenbankdatei zu verändern (Abbildung 4).
Das Einfügen von Zeilen in eine Datenbankdatei mittels Embedded SQL unterscheidet sich leicht vom SQL-Einsatz zum Verändern oder Löschen von Zeilen. Die Ursache ist, dass ein SQL Insert Statement der Datenbankdatei jeweils nur eine einzelne Zeile hinzufügt. Das Hinzufügen einzelner Zeilen jedoch ist eine Aufgabe, die sich mit RPG ebenso gut erledigen lässt wie mit SQL. Es ist aber auch möglich, Insert Statements zu schreiben, die einer Tabelle (oder mehreren Tabellen) mehrere Zeilen hinzufügt, indem selektierte Daten aus einer anderen Tabelle kopiert werden. In Situationen, in denen mehrere Zeilen hinzugefügt werden sollen, kann Embedded SQL durchaus als Alternative zum Hinzufügen jedes einzelnen Satzes mittels einer Schleife im RPG Code sinnvoll sein.
| Abbildung | ||||||
| Abb |
|
|||||
Vermeidung von Problemen
ILE RPG Programme, die Embedded SQL enthalten, sollten den Teildateityp SQLRPGLE haben. Ähnliche Teildateitypen existieren für ILE Cobol (SQLCBLLE) sowie für CL und nicht-ILE Versionen der System i Sprachen. Wir werden uns hier jedoch nur mit ILE RPG befassen. Eine SQLRPGLE Quellenteildatei wird mit der Anweisung CRTSQLRPGI (Create SQL ILE RPG Object) umgewandelt. Dabei wird vor der eigentlichen RPG-Umwandlung der SQL Precompiler ausgeführt. Die Werte, die für die diversen Optionen der Anweisung CRTSQLRPGI gewählt werden, steuern den SQL Precompiler und haben unter Umständen Einfluss darauf, wie der Embedded SQL Code später ausgeführt wird. In Abbildung 6 sind einige der wichtigsten CRTSQLRPGI Optionen und deren empfohlene Einstellungen aufgeführt. Detaillierte Informationen zu allen Precompiler-Optionen sind in den CL Reference-Informationen zur Anweisung CRTSQLRPGI zu finden.
Die Handhabung der Bibliothekslisten ist vermutlich eines der größten Probleme, in das man beim Arbeiten mit SQL in einer System i Umgebung leicht gerät. Für Programme, die Embedded SQL enthalten, ist es angeraten, die SQL Namenskonventionen auf *SYS zu setzen. Dieser Ansatz bringt Ergebnisse, die entweder identisch oder zumindest sehr ähnlich der Unterstützung von Bibliothekslisten in der gewohnten Umgebung traditioneller RPG Anwendungen sind. Grundsätzlich gilt:
- Die Namenskonvention *SYS sollte gewählt werden, wenn Anwendungen erstellt werden, die traditionelle System i Sprachen verwenden und vollständig auf dem System i ausgeführt werden sollen.
- Die SQL-Namenskonvention *SQL sollte gewählt werden, wenn das Embedded SQL Programm von einer Code-Komponente aufgerufen werden kann, die nicht System i-spezifisch ist, wie beispielsweise einer Java Methode.
Die Performance ist ein weiterer kritischer Punkt, der beim Design von Anwendungen, die Embedded SQL enthalten, beachtet werden sollte. Idealerweise sollte die Hinzunahme von Embedded SQL in den Pool der Entwicklungstools die Performance grundsätzlich verbessern, aber ganz so einfach ist es natürlich nicht. SQL kann die Performance negativ beeinflussen, wenn es in Situationen eingesetzt wird, in denen der Native-Datenbankzugriff eine bessere Performance erbringt oder wenn der SQL Code in einer Weise geschrieben ist, die den Query Optimizer (die i5 Query Engine) daran hindert, den Code in effizienter Weise auszuführen. Somit sollte man sich während der Entwicklungsarbeit auf diverse Performance-Analysen einstellen, speziell bei Anwendungen, die komplexe Queries enthalten, in denen große Datenmengen verarbeitet werden müssen. Glücklicherweise beinhaltet i5/OS eine ganze Reihe von Tools, die bei der Messung der SQL Performance und dem Auffinden der Engpässe behilflich sind.
Letztendlich sollten, wie im Grunde bei jeder anderen Anwendungsentwicklung, in den Embedded SQL Programmen Dinge wie hard-coding vermieden sowie Redundanzen minimiert werden. Zum Erreichen dieser Ziele mag es erforderlich sein, Service Programme, Stored Procedures und andere Techniken einzubinden, die dazu geeignet sind, den Code in verwaltbare, wieder verwendbare Komponenten zu segmentieren.
Nutzen Sie Ihren SQL Skill in der Praxis
Die Einbindung von SQL in System i Anwendungen bedeutet nicht notwendigerweise einen Ersatz der Native Datenbankzugriffe, sondern eher den Einsatz von SQL in jenen Situationen, in denen RPG die Aufgabenstellung nicht oder nur mit größerer Mühe abhandeln kann. Es gibt eine ganze Reihe von Techniken, um SQL in diesem Sinne einzubringen. Möglicherweise verfügen Sie ja bereits über die erforderlichen Skills, um Programme mit Embedded SQL zu schreiben.
Mehr als nur ein wenig an der Oberfläche dessen zu kratzen, was Embedded SQL zu leisten in der Lage ist, hätte den hier vorgegebenen Rahmen gesprengt aber in Publikationen wie dem Embedded SQL Programmierhandbuch und weiteren Veröffentlichungen in NEWSolutions findet sich eine Vielzahl zusätzlicher Informationen. #


