In dieser und der nächsten Folge beschäftigen wir uns mit SQL Application Services-Funktionen, die uns bei verschiedenen Formen der asynchronen Programmkommunikation helfen können.
Asynchrone Programmkommunikation
Neben den bereits besprochenen Datenwarteschlangen (*DTAQ) stehen uns folgende Werkzeuge zur Verfügung:
- Data Areas (*DTAARA) werden in Teil 8 beschrieben worden
- User Spaces (*USRSPC) werden in diesem Teil beschrieben
- User Indexes (*USRODX) werden in Teil 10 beschrieben
User Spaces
User Spaces führen den Gedanken einer Data Area weiter: Der User Space ist ein Objekt, das aus einer Anzahl von Bytes besteht, die zum Speichern beliebiger benutzerdefinierter Informationen verwendet werden können. Sie dienen der systemweiten Kommunikation und können damit auch auf der Jobebene genutzt werden. Sie weisen, verglichen mit der Data Area, jedoch einige Vorteile auf:
- User Spaces können automatisch erweitert werden, d. h. dass sie zur Familie der dynamischen Objekte gehören. Je größer die Menge der Daten in einem User Space wird, desto größer wird der User Space.
- Die maximale Größe eines User Spaces beträgt 16.773.120 Byte.
- User Spaces können über Initial Program Loads (IPLs) hinweg existieren, was bedingt, dass die Daten in einem User Space nicht flüchtig sind.
Bisher gab es jedoch einen Nachteil bei der Arbeit mit User Spaces: Es gab weder auf der Systemebene (CL) noch innerhalb der Syntaxen der IBM i-Programmiersprachen Befehle, um mit User Spaces zu arbeiten. Die einzige Möglichkeit bestand in der Anwendung von API-Funktionen.
Im Rahmen der IBM i-Services sind jedoch Wrapper-Funktionen um diese API bereitgestellt worden, so dass wir Stand heute relativ einfach mit User Spaces arbeiten und damit ihre Vorteile vergleichsweise leicht nutzen können.
Einen User Space erstellen
Um einen User Space zu erstellen, wurde die Stored Procedure CREATE_USER_SPACE implementiert.
190 CALL QSYS2.CREATE_USER_SPACE(USER_SPACE => 'USRSPC1',
191 USER_SPACE_LIBRARY => 'EPSSCLDTA',
192 SIZE => 1000,
193 PUBLIC_AUTHORITY => '*EXCLUDE');
Die zu übergebenden Parameter erklären sich fast von selbst. Der Parameter SIZE gibt die Anfangsgöße eines User Spaces an!
Weitere Informationen: IBM i / 7.5.0 / CREATE_USER-SPACE procedure
Informationen zu User Spaces sammeln
Ich möchte mir jetzt diesen soeben erstellten User Space genauer ansehen. Dazu verwende ich die SQL-View USER_SPACE_INFO. Mit folgender SQL-Anweisung greife ich auf den User Space USRSPC1 zu:
196 SELECT * FROM QSYS2.USER_SPACE_INFO
197 WHERE USER_SPACE_LIBRARY = 'EPSSCLDTA';
Das Ergebnis:

Beachten Sie das Feld ‚Size‘. Ich hatte die Anfangsgröße des User Space mit 1.000 Byte angegeben. Wir sehen hier jedoch, dass er eine Größe von 4.096 Byte hat. Bei der Erstellung eines User Space wird nach freien Speicherblöcken von 4K gesucht, der dann auch gefunden wurde. Damit ist garantiert, dass 1.000 Byte weggeschrieben werden können. Treffen noch weitere Daten ein, so steht für diese Daten ebenfalls Speicher bereit. Erst wenn die 4K-Grenze überschritten wird, werden ein oder mehrere neue 4K-Blöcke alloziert.
Daten in den User Spaces schreiben.
Mit der Stored Procedure CHANGE_USER_SPACE schreibe ich Daten in den User Space:
200 CALL QSYS2.CHANGE_USER_SPACE(USER_SPACE => 'USRSPC1',
201 USER_SPACE_LIBRARY => 'EPSSCLDTA',
202 DATA => 'New value!',
203 START_POSITION => 1);
Auch hier sind die Parameter fast alle selbsterklärend. Beachten Sie, dass Sie mit dem Parameter START_POSITION die genaue Position der Daten im User Space angeben müssen.
Daten aus dem User Spaces auslesen.
Möchte ich auf die Daten eines User Space lesend zugreifen, verwende ich dafür die SQL-Table-Funktion USER_SPACE().
207 SELECT * FROM TABLE(USER_SPACE(
208 USER_SPACE => 'USRSPC1',
209 USER_SPACE_LIBRARY => 'EPSSCLDTA'));
Das Ergebnis:

Den User Spaces vergrößern bzw. verkleinern
Um die Attribute eines User Space zu verändern, gibt es die Stored Procedure CHANGE_USER_SPACE_ATTRIBUTES. Ich beabsichtige den User Space zu vergrößern:

Ich habe die Größe jetzt auf 10.000 Byte gesetzt.
Bleiben die Daten erhalten?
SELECT * FROM TABLE(USER_SPACE(
USER_SPACE => 'USRSPC1',
USER_SPACE_LIBRARY => 'EPSSCLDTA'));

Definitiv, ja!
Wie sehen jetzt die Metadaten des User Space aus?
SELECT * FROM QSYS2.USER_SPACE_INFO
WHERE USER_SPACE_LIBRARY = 'EPSSCLDTA';

Im nächsten Teil werden wir uns weiter mit diversen Tools beschäftigen, mit denen Programmierer auf einfache Art Programmierungsprobleme beheben können.
Den User Spaces löschen
Es gibt leider keine dedizierte SQL-Funktion um User Spaces zu löschen. Deshalb muss auch hier CL in die Bresche springen:
215 call qcmdexc('DLTUSRSPC USRSPC(EPSSCLDTA/USRSPC1)');
Alternativ:
217 cl:DLTUSRSPC USRSPC(EPSSCLDTA/USRIX1);
User Spaces stellen eine elegante und mächtige Alternative zu Data Areas dar und lassen sich mittels IBM i-Services leicht verarbeiten.
In der nächsten Ausgabe betrachten wir die sogenannten User Indexes, eine weitere Möglichkeit der asynchronen Kommunikation.
Lesen Sie dazu SQL Application Services – Teil 10: SQL-Helper für Programmierer 04.
Den Autor Klaus-Peter Luttkus erreichen Sie unter:
E-Mail: klaus.peter@luttkus-bremen.de
Website: luttkus-bremen.de
Für 88 Euro gibt’s hier sechs Monate lang tiefgreifendes IBM i und SQL Wissen. Hier kann man abonnieren.