Kapitel 3 - Syntaxbeschreibung
295
Kapitel 3 - Syntaxbeschreibung
So geht's
296
REXX unter OS/2
Kapitel 3 - Syntaxbeschreibung
297
Lesehilfe für Syntaxdiagramme Bevor wir uns mit der Syntax der Befehle und Funktionen auseinandersetzen, möchte ich anhand einiger Beispiele eine kleine Lesehilfe für die Syntaxbeschreibung liefern. Grundsätzlich kann bei der Interpretation der syntaktischen Möglichkeiten immer dem Linienverlauf gefolgt werden. Sehen wir uns zu den verschiedenen Variationen je ein Beispiel an:
befehl
Ein Befehl wird ohne Parameter kodiert.
befehl
zwingender parameter
An einen Befehl geknüpft muß ein Parameter zwingend angegeben werden.
befehl
einer dieser Parameter muß angegeben werden einer dieser Parameter muß angegeben werden einer dieser Parameter muß angegeben werden
Unter mehreren möglichen Parametern muß einer zwingend angegeben werden.
befehl
Unter mehreren möglichen Parametern kann einer wahlfrei angegeben werden.
befehl
dieser Parameter kann wiederholt werden
Die wiederholte Angabe eines Parameters ist möglich.
Lesehilfe für Syntaxdiagramme
einer dieser Parameter kann angegeben werden einer dieser Parameter kann angegeben werden
298
REXX unter OS/2
Lesehilfe für Syntaxdiagramme Wie diese Regel in einem komplexeren Diagramm ausgelegt wird, soll das nachfolgende Beispiel verdeutlichen:
befehl kann_1 kann_1.1 kann_1.2 kann_2 kann_3 kann_4
kann/muß_4.3 kann_4.1 kann_4.2
kann_5
kann_5.1.mehrmals
Unter mehreren möglichen Parametern kann zunächst einer ausgewählt werden. Neben Parameter2 oder 3 kann keine weitere Angabe erfolgen. Hinter Parameter1 kann einer von zwei möglichen Subparametern angegeben werden. Die Angabe des Subparameters ist aber nicht zwingend. Wird Parameter4 kodiert, ist die Angabe eines der beiden Unterparameter (4.1 oder 4.2) möglich. Gleichgültig, ob einer der beiden Unterparameter angegeben wurde oder nicht, die Angabe des Parameters 4.3 ist zwingend. Wird der fünfte Parameter kodiert, ist ein Subparameter mit anzugeben. Der Subparameter kann beliebig oft wiederholt werden.
Lesehilfe für Syntaxdiagramme
Darüber hinaus gilt innerhalb der Diagramme folgende Regelung:
GROSSBUCHSTABEN
➪
sind als feste Bestandteile des Befehles unverändert zu übernehmen
kleinbuchstaben
➪
haben eine Stellvertreterfunktion und sind durch entsprechende Werte zu ersetzen
Klammern()
➪
sind als feste Bestandteile des Befehles zu kodieren
UNTERSTRICHENES
➪
stellt einen Defaultwert dar, der angenommen wird, wenn keine Parameterangabe erfolgt
299
ABBREV() ABBREV(string1,string2
Liebe Leser....
Kapitel 3 - Syntaxbeschreibung
) ,länge
Übergibt eine 1, wenn string2 identisch mit dem Beginn von string1 ist und die Länge von string2 nicht größer der angegebenen Länge ist. Wird diese Bedingung nicht erfüllt, erfolgt die Rückmeldung von 0. string1 Zeichenfolge, die geprüft werden soll. string2 Zeichenfolge, die als Grundlage für die Prüfung eingesetzt wird. länge Maximale inhaltliche Länge, die bei der Püfung von string2 berücksichtigt wird.
Beispiele: SAY ABBREV('Print','Pri') SAY ABBREV('PRINT','Pri') SAY ABBREV('PRINT','P',1)
1 0 1 REXX-Funktion
/**REXX*****************************/ PARSE UPPER ARG TEST . IF ABBREV(TEST,'T',1) THEN TRACE '?R'
300
REXX unter OS/2
ABS() ABS(zahl)
Übergibt den absoluten Wert einer Zahl ohne Rücksicht auf das Vorzeichen. zahl
REXX-Funktion
Die Zahl, deren absoluter Wert übergeben werden soll.
Beispiele: SAY ABS('5.95') SAY ABS('-6.04')
5.95 6.04
Kapitel 3 - Syntaxbeschreibung
301
ADDRESS ADDRESS umgebung ausdruck ausdruck1 wert
Mit ADDRESS wird die Systemumgebung benannt, an die ein Befehl zu übergeben ist. Unter OS/2-REXX sind folgende Umgebungen erreichbar: CMD Der OS/2-Befehlsprozessor PMREXX Die PrEsentation Manager Umgebung oder jede andere durch ADDRESS eingestellte Umgebung (wie ISREDIT unter SPF/2) umgebung Name des Environments, an das Befehle zur Ausführung übergeben werden sollen. ausdruck Befehl für das Environment. Der Befehl kann als Literal oder in einer Variablen übergeben werden. Hinweise: Die aktuelle Zuordnung kann durch die Built-in-Funktion ADDRESS() ermittelt werden.
Beispiele: ADDRESS ISREDIT "(start) = .ZF"
REXX-Instruktion
Um einen Befehl an die entsprechende Systemumgebung zu übergeben, wird der Name der Umgebung und der entsprechende Befehl angegeben. Nach Ausführung wird in die aktuelle Systemumgebung zurückgekehrt, wie immer sie heißt. Wird nur eine Systemumgebung angegeben, erfolgt eine Umschaltung dorthin. Sie bleibt erhalten, bis eine neue Umschaltung durchgeführt wird.
302
REXX unter OS/2
ADDRESS() ADDRESS()
REXX-Funktion
Meldet den Namen der Systemumgebung, innerhalb der die Abarbeitung der Befehle durchgeführt wird.
Beispiele: SAY ADDRESS() SAY ADDRESS() SAY ADDRESS()
'CMD' 'PMREXX' 'ISREDIT'
/* möglich */ /* möglich */ /* möglich */
Kapitel 3 - Syntaxbeschreibung
303
ARG() ARG(
) zahl ,E ,O
Übergibt eine Folge von Parametern oder Informationen über Parameter entsprechend der angegebenen Option. Wird kein Parameter in der ARG-Funktion angegeben, wird die Anzahl der übergebenen Parameter gemeldet. zahl Wird eine Zahl angegeben, wird der betreffende Parameter gelistet. Existiert das Argument nicht, wird ein Nullstring rückgemeldet. ,E Prüft das Vorhandensein (Exists) eines Argumentes und liefert 1 bei Vorhandensein bzw. eine 0 bei Nichtvorhandensein ,O Liefert eine 1 bei Nichtvorhandensein (Omitted), eine 0 bei Vorhandensein des Argumentes. Hinweis: Die Funktion arbeitet in der Hauptsteuerleiste (das von der Befehlszeile aus aufgerufene, hierarchisch oberste Programm einer Anwendung) fehlerhaft. Beispiele: (Keine Parameterangaben) 0 ' ' 0
Angenommen: DEMO1 'a',,'b' SAY ARG() 3 SAY ARG(1) 'a' SAY ARG(2) ' ' SAY ARG(3) 'b'
REXX-Funktion
Angenommen: DEMO1 SAY ARG() SAY ARG(1) SAY ARG(1,'E')
304
REXX unter OS/2
BEEP() BEEP(frequenz,dauer)
Erzeugt einen Ton. frequenz Die Hertzfrequenz des zu erzeugenden Tones. dauer Die Länge des Tones in Millisekunden. Frequenz kann ein Wert zwischen 37 und 32767, Dauer ein Wert zwischen 1 und 60.000 sein.
Beispiele:
OS/2-Funktion
/* REXX * CDUR ***********************/ c_dur="262 294 330 349 392 440 494 524" do i=1 to words(c_dur) call beep word(c_dur,i),500 end exit
/* REXX * PFIFF **********************/ do a=1 to 3 if a // 2 = 1 then do wert=50;start=2500;ende=2800 end else do wert=-50;start=2800;ende=2500 end do i=start to ende by wert call beep i,10 end end exit
Kapitel 3 - Syntaxbeschreibung
305
BIND "BIND datei TO DATABASE
" USING :option
Im Regelfall wird dieser Befehl nur gebraucht, wenn DB2/2 mit Programmen arbeiten soll, deren Quellencode aus zu kompilierenden Sprachen stammt (Cobol, C etc.). In diesen Fall werden SQL-Befehle vorübersetzt und mit der Datenbank verbunden. Hier soll BIND lediglich genutzt werden, um über entsprechende Optionen das Datumsformat für Europa anzupassen. datei Name der BIND-Datei in den Ablauf von DB2/2 eingebunden. Zur Nutzung unter REXX werden von der IBM mit DB2/2 drei Bindedateien für die unterschiedlichen Isolations Level mitgeliefert. Unser Zweck kann mit jeder beliebigen dieser Dateien SQLARXCS.BND, SQLARXUR.BND und SQLARXRR.BND) erreicht werden. USING :optionen Benennt den gemeinsamen Namensstamm von Compoundvariablen, die folgende Bedeutung haben (für uns sind nur die ersten beiden von Interesse, auf die restlichen verzichten wir): option.0 ..... Anzahl der Variablen des Stammes. option.1 ..... Datums- und Zeitformate. Möglich sind: DEF, USA, EUR, ISO, JIS und LOC option.2 ..... Isolation Level. Möglich sind (siehe Kapitel 1): RR, UR und CS
option.0=1 option.1="EUR" CALL SQLDBS "BIND C:\SQLLIB\SQLARXCS.BND TO DATABASE" , "USING :option" Regelt, daß Datums- und Zeitfelder gemäß der europäischen Schreibweise geführt werden.
DB2/2-SQLDBS-Befehl
Beispiel:
306
REXX unter OS/2
BITAND() BITAND(b-str-1
) , b-str-2
,füll
Das Ergebnis von BITAND() ist eine binäre Zeichenkette, die sich aus zwei Eingabezeichenketten zusammensetzt, die durch ein logisches UND bitweise logisch miteinander verglichen werden. Die Länge der Ausgabe entspricht der Länge der längeren Zeichenfolge. b-str-1 Die erste der durch UND miteinander zu verknüpfenden Zeichenketten. b-str-2 Die zweite der durch UND miteinander zu verknüpfenden Zeichenketten. füll Ist kein Füllzeichen angegeben, wird der UND-Vergleich beendet, sobald die kürzere der beiden Zeichenfolgen endet. Der verbleibende Rest der unverarbeiteten Zeichenfolge wird an das Ergebnis angehängt.
REXX-Funktion
Wurde ein Füllzeichen angegeben, wird die kürzere der beiden Zeichenketten rechts bis auf die Länge der anderen Zeichenkette aufgefüllt.
Beispiele: SAY BITAND('73'x,'27'x) SAY BITAND('43'x,'3333'x) SAY BITAND('43'x,'3333'x,'24'x)
'23'x '0333'x '0320'x
Kapitel 3 - Syntaxbeschreibung
307
BITOR() BITOR(b-str-1
) , b-str-2
,füll
Ausgabe ist eine binäre Zeichenkette, die sich aus zwei Eingabezeichenketten zusammensetzt, die durch ein logisches ODER bitweise logisch miteinander verglichen werden. Die Länge der Ausgabe entspricht der Länge der längeren Zeichenfolge. b-str-1 Die erste der durch ODER zu verknüpfende binäre Zeichenfolge. b-str-2 Die zweite der durch ODER zu verknüpfende binäre Zeichenfolge. füll Ist kein Füllzeichen angegeben, wird der ODER-Vergleich beendet, sobald die kürzere der beiden Zeichenfolgen endet. Der verbleibende Rest der unverarbeiteten Zeichenfolge wird an das Ergebnis angehängt. Wurde ein Füllzeichen angegeben, wird die kürzere der beiden Zeichenketten rechts bis auf die Länge der anderen Zeichenkette aufgefüllt.
SAY BITOR('12'x,'23'x) SAY BITOR('12'x,'2345'x) SAY BITOR('12'x,'2345'x,'40'x)
'33'x '3345'x '3374'x
REXX-Funktion
Beispiele:
308
REXX unter OS/2
BITXOR() BITXOR(b-str-1
) , b-str-2
,füll
Ausgabe ist eine Zeichenkette, die sich aus zwei Eingabezeichenketten zusammensetzt, die durch ein logisches EXCCUSIVE-ODER bitweise logisch miteinander verglichen werden. Die Länge der Ausgabe entspricht der Länge der längeren Zeichenfolge. b-str-1 Die erste der durch EXCLUSIVE-ODER zu verknüpfende binäre Zeichenfolge. b-str-2 Die zweite der durch EXCLUSIVE-ODER zu verknüpfende binäre Zeichenfolge. füll Ist kein Füllzeichen angegeben, wird der EXCLUSIVE-ODER-Vergleich beendet, sobald die kürzere der beiden Zeichenfolgen endet. Der verbleibende Rest der unverarbeiteten Zeichenfolge wird an das Ergebnis angehängt.
REXX-Funktion
Wurde ein Füllzeichen angegeben, wird die kürzere der beiden Zeichenketten rechts bis auf die Länge der anderen Zeichenkette aufgefüllt.
Beispiele: SAY BITXOR('12'x,'23'x) SAY BITXOR('12'x,'2345'x) SAY BITXOR('12'x,'2345'x,'40'x)
'31'x '3145'x '3174'x
Kapitel 3 - Syntaxbeschreibung
309
B2X() B2X(binärkette)
Wandelt eine binäre Zahl in eine hexadezimale Zahl um. Das Ergebnis enthält gegebenenfalls die Großbuchstaben A-F, keine Blanks. binärkette Die der Funktion als Input zu übergebende binäre Zeichenkette.
Hinweise: Zur besseren Lesbarkeit innerhalb der Binärzeichenkette kann zwischen zwei VierBit-Gruppen eine Leerstelle kodiert werden. Ist die Länge der Binärzeichenfolge nicht restlos durch vier teilbar, wird entsprechend links mit Nullen aufgefüllt.
SAY B2X('1101') SAY B2X('11010011') SAY B2X('1101 0011 1001')
'D'x 'D3'x 'D39'x
REXX-Funktion
Beispiele:
310
REXX unter OS/2
CALL CALL name , ausdruck
Durch die CALL-Instruktion kann eine EXEC (REXX-Programm) aus einer EXEC heraus aufgerufen werden. Es spielt dabei keine Rolle, ob es sich hierbei um eine interne Prozedur (sog. Subroutine) oder eine externe Prozedur (eingenständiges CMD-File) handelt. name Name der Subroutine, des Unterprogrammes oder der Funktion, die aufgerufen werden soll. ausdruck Übergabewert. Kann in Form von Literalen oder Variablen kodiert werden. Hinweise: Unterschiede ergeben sich nur aus den Übergabe-Übernahmemöglichkeiten von Variablen. Im Falle einer Subroutine sind Variablen mit ihren aktuellen Werten sowohl in der Hauptprozedur als auch in der Subroutine immer bekannt. Wird ein externes REXX-Programm aufgerufen, müssen Variablen in beide Richtungen übergeben und empfangen werden (siehe auch RETURN und RESULT). Wird der Name als Literal kodiert, erfolgt der Aufruf zwingend extern.
REXX-Instruktion
Beispiel: /* REXX ***********************************/ SAY "Zahl zwischen 1 und 5" PULL zahl CALL CHECK zahl EXIT CHECK: IF zahl >= 1 & zahl 0 SAY "Auswahl??" wahl = TRANSLATE(SYSGETKEY("NOECHO")) END SELECT WHEN wahl = "E" THEN LEAVE WHEN wahl = 1 THEN CALL blk_jack : END END SAY "Bye. bye..." EXIT
354
REXX unter OS/2
DO UNTIL bedingung DO UNTIL bedingung befehl(e) END
Die Schleife wird durchlaufen, bis die schleifensteuernde Bedingung erfüllt ist. Im Gegensatz zur WHILE-Schleife wird die Bedingung erst am Schleifenende überprüft und entschieden, ob die Schleife ein weiteres Mal durchlaufen werden soll. Ein Durchlauf findet in jedem Fall statt.
Beispiele:
REXX-Instruktion
: DO UNTIL durst = "N" CALL trinken SAY "Durst (J/N)" PULL durst END SAY "Ruelps" : Dieses Beispiel könnte man im Südstaaten-Slang dokumentieren: "A bissl was geht immer", oder wie der Bayer sagt: Der Mensch hebt sich dadurch vom Tier ab, daß er nicht trinkt, weil er Durst hat, sondern weil's ihm schmeckt. Egal ob Durst vorhanden ist oder nicht, eins geht immer. : DO UNTIL eingabe > 0 & eingabe < 10 SAY "Geben Sie eine Zahl zwischen 1 und 9 ein" PULL eingabe END : Hier haben wir eine in die Schleifenbedingung integrierte Plausibilitätsprüfung der Bedienereingabe. Die Schleife wird zunächst in jedem Fall betreten und erlaubt dem Bediener eine Tastatureingabe. Am Schleifenende wird die Bedingung geprüft. Ist sie erfüllt, war die Eingabe richtig, und die Schleife wird verlassen. Ansonsten wird sie aufs neue betreten und erlaubt dem Bediener einen neuen Eingabeversuch.
Kapitel 3 - Syntaxbeschreibung
355
DO WHILE bedingung DO WHILE bedingung befehl(e) END
Die Schleife wird durchlaufen, solange die schleifensteuernde Bedingung erfüllt ist. Im Gegensatz zur UNTIL-Schleife wird die Bedingung bereits am Schleifenanfang überprüft und vor dem ersten Betreten der Schleife entschieden, ob sie durchlaufen werden soll. Ist die Bedingung am Schleifenanfang nicht erfüllt, wird die Schleife übersprungen. Wurde die Schleife einmal durchlaufen, wird bei Rückkehr zum Schleifenkopf die Bedingung aufs neue überprüft. Trifft sie noch immer zu, wird die Schleife ein weiteres Mal durchlaufen. Anderenfalls wird die Schleife verlassen. Beispiele: : SAY "Durst (J/N)" PULL durst DO WHILE durst = "J" CALL trinken SAY "Durst (J/N)" PULL durst END SAY "Auf Wiedersehen" : Ist kein Durst vorhanden, wird die Schleife nicht betreten. Anderenfalls wird sie durchlaufen und die Bedingung vor jedem weiteren Durchlauf aufs neue überprüft. Trifft die Bedingung nicht mehr zu, wird die Schleife verlassen.
REXX-Instruktion
/* REXX * DEMO ********************************/ ARG zahl DO WHILE DATATYPE(zahl) = "CHAR" SAY "Geben Sie eine Zahl ein" PULL zahl END : Das Programm kann einen Startwert empfangen, der numerisch sein muß. Wurde kein (zahl ist NULLSTRING) oder ein falscher Wert übergeben, wäre die Schleifenbedingung erfüllt, und in der Schleife wird so lange eine Bedienereingabe verlangt, bis diese Eingabe numerisch ist. Wurde ein numerischer Startwert empfangen, wird die Schleife übersprungen.
356
REXX unter OS/2
DROP DROP variable ,variable
Durch DROP werden Variablen oder Variablenstämme auf Grundwert gesetzt (sie zeigen inhaltlich wieder auf ihren zu Großschreibung konvertierten Eigennamen).
REXX-Instruktion
Beispiele: y=5 drop a x.1 x.y Löscht die Inhalte der Variablen A, X.1 und X.5 DROP eingabe. Setzt alle Variablen des Stammes EINGABE. zurück, das heißt alle Variablen, die mit EINGABE. beginnen.
Kapitel 3 - Syntaxbeschreibung
357
DROP "DROP
INDEX index TABLE tabelle
"
Führt eine Löschung in der Datenbank durch. INDEX index Führt zum Löschen eines Index aus der Datenbank. TABLE tabelle Entfernt eine Tabelle mit allen Daten und Definitionen aus der Datenbank.
Ein Index, der zu einem Primärschlüssel gehört, kann nicht gelöscht werden. Wird dagegen der Primärschlüssel gelöscht, wird auch der zugehörige Index gelöscht. Mit dem Löschen einer Tabelle werden auch deren Indizes, Primär- und Fremdschlüssel gelöscht. Nach dem Löschen einer Tabelle kann deren Name wieder neu vergeben werden.
DB2/2-SQLEXEC-Befehl
Hinweise:
358
REXX unter OS/2
D2C() D2C(integer
) ,wert
Umwandlung von Dezimal nach Character. Wenn wert nicht angegeben ist, muß integer eine positive Zahl sein, ansonsten wird ein Fehler erzeugt. integer Dezimalwert, der umgewandelt werden soll. wert
REXX-Funktion
Ist die Länge des Ergebnisses in Byte nach der Übersetzung. Hat das Ergebnis in der angegebenen Anzahl Byte nicht Platz, wird entsprechend links abgeschnitten.
Beispiele: SAY SAY SAY SAY SAY
D2C(7) D2C(129) D2C(129,1) D2C(129,2) D2C(45,0)
'07'x '81'x '81'x '0081'x ''
Kapitel 3 - Syntaxbeschreibung
359
D2X() D2X(integer
) ,wert
Umwandlung von Dezimal nach Hexadezimal. Wenn wert nicht angegeben ist, muß integer eine positive Zahl sein, ansonsten wird ein Fehler erzeugt. integer Dezimalzahl, die umgewandelt werden soll. wert Ist die Länge des Ergebnisses in Byte nach der Übersetzung. Hat das Ergebnis in der angegebenen Anzahl Byte nicht Platz, wird entsprechend links abgeschnitten.
SAY SAY SAY SAY SAY SAY
D2X(7) D2X(129) D2X(129,1) D2X(129,2) D2X(129,4) D2X(45,0)
'7' '81' '1' '81' '0081' ''
REXX-Funktion
Beispiele:
360
REXX unter OS/2
ENDLOCAL() ENDLOCAL()
ENDLOCAL() stellt die Situation für aktuelles Laufwerk, Verzeichnis und die Umgebungsvariablen wieder her, wie sie vor der letzten SETLOCAL()-Funktion gültig waren.
Hinweise: Wird nach aufgerufener SETLOCAL()-Funktion im Programm kein ENDLOCAL() kodiert, werden die abgespeicherten Werte bei Ende des Programmes rückgespeichert. Die Funktion liefert eine 0, wenn das Rückspeichern nicht möglich war, bzw. eine 1 bei ordnungsgemäßem Ende.
OS/2-Funktion
Beispiel: /* REXX ********************************/ : tmp=setlocal() pull eingabe /* Umgebungsvariable, Laufwerk und aktuelles /* Verzeichnis können verändert werden tmp=endlocal() /* das ursprüngliche Umfeld wird wieder /* rückgespeichert :
*/ */ */ */
Kapitel 3 - Syntaxbeschreibung
361
ERRORTEXT() ERRORTEXT(meldungsnummer)
Übergibt die entsprechende Fehlermeldung. Die Meldungsnummer muß zwischen 0 und 99 liegen, ansonsten wird ein Nullstring übergeben. Die Fehlermeldungen stehen in unmittelbarem Zusammenhang mit den ausgegebenen Returncodes. Wird bei Syntaxfehler RC 16 ausgegeben, wird diese Situation in der Fehlermeldung 16 erklärt. Eine Beschreibung der REXX-Fehlernummern und -meldungen finden Sie im Anhang A.
SAY ERRORTEXT(16) SAY ERRORTEXT(36) SAY ERRORTEXT(60)
'Label not found' 'Unmatched "(" in Expression' ' '
REXX-Funktion
Beispiele:
362
REXX unter OS/2
EXECUTE "EXECUTE befehl
" , USING variable USING DESCRIPTOR descriptor
Führt einen vorher übersetzten SQL-Befehl aus. befehl Der Befehl, der unter diesem Namen über PREPARE übersetzt wurde. USING variable Eine oder mehrere Variablen, die bei dynamischen SELECT-Befehlen der Reihe nach die Platzhalter ersetzen. USING DESCRIPTOR descriptor
DB2/2-SQLEXEC-Befehl
Zeigt auf die SQLDA (Dynamic Area), die die Programmvariablen beschreibt. Vor OPEN müssen die entsprechenden Werte in die SQLDA gestellt werden.
Kapitel 3 - Syntaxbeschreibung
363
EXECUTE "EXECUTE IMMEDIATE variable"
Übersetzt einen SQL-Befehl, der als Zeichenkette vorliegt. Im Gegensatz zu EXECUTE wird die übersetzte Form des Befehles nach Ausführung sofort wieder gelöscht. variable Enthält den zu übersetzenden Befehl. Nicht auf diese Weise zu verarbeiten sind die Befehle: SELECT INTO, EXEC SQL und Befehls-Delimiter wie END-EXEC.
Enthält die zu übersetzende Zeichenkette Fehler, liegt der entsprechende Fehlercode in der SQLCA.
DB2/2-SQLEXEC-Befehl
Hinweis:
364
REXX unter OS/2
EXIT EXIT zahl
Wird benutzt, um eine Prozedur unmittelbar zu beenden. Mit EXIT kann das Ende der Prozedur auch inmitten des Ablaufes gelegt werden. zahl Muß eine ganze Zahl zwischen 0 und 4095 sein. Wird zahl angegeben, wird der Wert bei Programmende als Returncode zurückgemeldet.
Beispiele:
REXX-Instruktion
/* REXX **************************************/ DO FOREVER CALL SYSCLS SAY 'Druckdatei angeben' PULL datei IF LENGTH(datei) = 0 THEN EXIT /* Instruktionen zur Verarbeitung */ END
/* REXX **************************************/ ARG PARM IF LENGTH(parm) = 0 THEN EXIT 4 : /* Regulaere Verarbeitung */ : EXIT 0
Kapitel 3 - Syntaxbeschreibung
365
FETCH "FETCH cursor
, INTO variable USING DESCRIPTOR descriptor
"
Positioniert den Satzzeiger in der Ergebnistabelle auf den nächsten Satz und kopiert die Feldinhalte der Ergebnistabelle in die angegebenen Programmvariablen. cursor Name des Cursors (Satzzeigers) der mit DECLARE CURSOR definiert wurde. INTO variable Eine oder mehrere Variablen, die die Feldinhalte der Ergebnistabelle aufnehmen. Die Wertzuweisung erfolgt der Reihe nach von links nach rechts. USING DESCRIPTOR descriptor Zeigt auf die SQL-Dynamic Area, die eine Beschreibung der Variablen enthält, die zur Wertübernahme genutzt werden sollen. Die SQLDA muß vor Befehlsausführung entsprechend versorgt werden.
Steht der Satzzeiger bereits auf oder hinter dem letzten Datensatz, wird in SQLCODE der Wert +100 zurückgegeben.
DB2/2-SQLEXEC-Befehl
Hinweise:
366
REXX unter OS/2
FILESPEC() FILESPEC(
DRIVE PATH NAME
,datei)
Zerlegt einen vollständigen Dateinamen in Laufwerk, Pfad und Dateinamen gemäß der angegebenen Option. DRIVE Der Laufwerksbuchstabe von datei. Der Parameter kann mit D abgekürzt werden. PATH Der Verzeichnispfad von datei. Der Parameter kann mit P abgekürzt werden. NAME Der Name von datei mit Dateierweiterung. Der Parameter kann mit N abgekürzt werden.
OS/2-Funktion
Beispiele: /* REXX **************/ parse source . . name . say filespec("D",name) say filespec("P",name) say filespec("N",name)
"D:" "\#RXOS2\" "DEMO.CMD"
/* möglich */ /* möglich */ /* möglich */
Kapitel 3 - Syntaxbeschreibung
367
FORM() FORM()
Übergibt den aktuellen Wert aus NUMERIC FORM (siehe hierzu REXX-Instruktion NUMERIC).
REXX-Funktion
368
REXX unter OS/2
FORMAT() FORMAT(zahl
) ,vor ,nach
Formatiert eine Zahl in bezug auf Vor- oder Nachkommastellen unter Berücksichtigung der Regeln für Auf- oder Abrunden. zahl Ist nur zahl angegeben, wird nach den Regeln von REXX gerundet (NUMERIC DIGITS). vor Bestimmt die Anzahl der Vorkommastellen. Ist der Vorkomma-Stellenwert zu klein um zahl aufnehmen zu können, wird Fehler gemeldet. Ist der Vorkommawert größer, wird links mit BLANK aufgefüllt. nach
REXX-Funktion
Anzahl der Dezimalstellen. Werden in zahl vorhandene Nachkommastellen beschnitten, wird entsprechend gerundet. Ist der Wert größer, als die in zahl vorhandenen Dezimalstellen, wird mit 0 aufgefüllt.
Beispiele: SAY SAY SAY SAY SAY SAY
FORMAT('3',4) FORMAT('3.75',4,0) FORMAT('3.75',4,3) FORMAT('-.28',4,1) FORMAT('-4.5',,4) FORMAT(' - 6.76')
' 3' ' 4' ' 3.750' ' -0.3' '-4.5000' '-6.76'
Kapitel 3 - Syntaxbeschreibung
369
FUZZ() FUZZ()
Übergibt den aktuellen Wert aus NUMERIC FUZZ. Soll dieser Wert für einen Verarbeitungsschritt geändert werden, ist es sinnvoll, den aktuellen Wert in einer Variablen abzulegen, um nach der Verarbeitung NUMERIC FUZZ auf den alten Wert zurücksetzen zu können.
: altfuzz=fuzz() numeric fuzz 3 /* Verarbeitung mit dem neuen Wert von FUZZ */ numeric fuzz altfuzz :
REXX-Funktion
Beispiel:
370
REXX unter OS/2
GET "GET
DATABASE CONFIGURATION FOR dbk USING var DATABASE DIRECTORY ENTRY scanid USING var
"
Die GET-Anweisung erlaubt die Abfrage diverser Informationen aus dem Umfeld von DB2/2. DATABASE CONFIGURATION FOR dbk USING var Liefert Konfigurationsdaten über die angegebene Datenbank in der hinter USING angegebenen Compoundvariablen. Vor Aufruf müssen im gleichen Variablenstamm Werte vorbereitet werden. Der Aufbau des Variablenstammes sieht folgendermaßen aus: var.0 ..... Anzahl der Compoundvariablen, die gebildet werden sollen. var.1 ..... Wert, der abgefragt werden soll und in der nächsten Variablen zurückgeliefert wird. var.2 ..... Wert, der über die vorausgegangenen Variablen abgefragt wurde. var.3 ..... wie var.1 var.4 ..... wie var.2 : var.0 und alle ungeraden var-Elemente müssen vor Verarbeitung gefüllt werden. Alle geraden var-Elemente werden vom Befehl mit Daten gefüllt. Die möglichen Inhalte der ungeraden var-Elemente sind im Handbuch »DB2/2 Programming Guide« unter »SQLFUPD« nachzulesen.
DB2/2-SQLDBS-Befehl
GET DATABASE DIRECTORY ENTRY scanid Liefert globale Informationen über die Datenbank in einem Variablenstamm. Die Struktur des Stammes ist in den IBM-Handbüchern unter dem Schlagwort SQLDINFO nachzulesen. Wird keine Angabe USING var gemacht, wird als VariablenstammName SQLDINFO benutzt. Bevor die Abfrage erfolgen kann, muß ein "OPEN DIRECTORY..." erfolgen. Die einzelnen Variablen des Stammes haben folgende Bedeutung: var.0 ..... Anzahl der Copmpoundvariablen, die gebildet wurden (immer 9). var.1 ..... ALIAS-Name
Kapitel 3 - Syntaxbeschreibung
371
GET var.2 var.3 var.4 var.5 var.6 var.7 var.8 var.9
..... ..... ..... ..... ..... ..... ..... .....
Datenbankname Laufwerk Dateisystem Node Name (für entfernte Datenbanken) Datenbanktyp Kommentar CodePage Datenbankentyp (lokal oder entfernt)
Beispiele: CONFIG.0=4 CONFIG.1=100 /* Abfrage des Country Code */ CONFIG.3=101 /* Abfrage der Code Page */ CALL SQLDBS "GET DATABASE CONFIGURATION FOR db1 USING :config" Kann zu folgenden Variableninhalten führen: CONFIG.2 49 /* Rückgabe des Country Code */ CONFIG.4 850 /* Rückgabe der Code Page */
DB2/2-SQLDBS-Befehl
CALL SQLDBS "OPEN DATABASE DIRECTORY ON 0 USING :scan" CALL SQLDBS "GET DATABASE DIRECTORY ENTRY :scan.1 USING :info" CALL CLOSE "DATABASE DIRECTORY :scan.1" Kann zu folgenden Variableninhalten führen: INFO.0 9 /* ist immer 9 */ INFO.1 RXDEMO /* ALIAS-Name */ INFO.2 RXDEMO /* Datenbank-Name */ INFO.3 C: /* Laufwerk */ INFO.4 INFO.5 INFO.6 DB2/2 VER. 4.00 /* Datenbank Typ */ INFO.7 Test für REXX DB2/2 /* Kommentar */ INFO.8 850 /* Code Page */ INFO.9 0 /* Home Datenbank=lokal */
372
REXX unter OS/2
IF - THEN - ELSE IF bedingung THEN befehl ELSE befehl
IF bietet die Möglichkeit, eine bestimmte Situation zu erkennen. Trifft die Bedingung zu, wird der Befehl hinter THEN ausgeführt. IF Leitet die Fragestellung ein. bedingung Ist ein Ausdruck. Sollen mehrere kleine Bedingungen zu einer Frage zusammengefaßt werden, können sie mit Bool'schen Operanden miteinander verknüpft werden. THEN Ist der JA-Zweig. Er wird durchlaufen, wenn die Bedingung erfüllt ist. ELSE Ist der NEIN-Zweig. Er wird durchlaufen, wenn die Bedingung nicht erfüllt ist. Die Kodierung des Nein-Zweiges ist nicht zwingend. befehl Ist die Instruktion, die im Falle JA oder NEIN ausgeführt werden soll. Generell ist an den JA- oder NEIN-Zweig geknüpft nur eine Instruktion möglich. Sollen mehrere Befehle ausgeführt werden, sind sie als Befehlsfolge zwischen DO und END einzugrenzen und werden wie ein Befehl behandelt.
REXX-Instruktion
Beispiel: : IF ZAHL >= 20 & zahl bis THEN msg="FALSCH" ELSE msg="OK" RETURN msg
Kapitel 3 - Syntaxbeschreibung
403
PUSH PUSH ausdruck
Der aufgelöste Ausdruck wird im Stackbereich nach dem Prinzip LIFO (Last In First Out) eingefügt. Wird kein Ausdruck angegeben, wird ein Nullstring (eine Leerzeile) hinterlegt. Die aktuelle Anzahl von Sätzen im Stack kann durch die Built-in-Funktion QUEUED() ermittelt werden. ausdruck Variablen oder Literale können in Folge angegeben werden.
Beispiel:
REXX-Instruktion
Hat folgenden Inhalt des Stacks zur Folge: Fred Feuerstein August Nieselpriem Alfred Neumann Nullstring
REXX-Instruktion
push push 'Alfred Neumann' push "August Nieselpriem" push "Fred Feuerstein"
404
REXX unter OS/2
QUEUE QUEUE ausdruck
Der aufgelöste Ausdruck wird in den Stackbereich nach dem Prinzip FIFO (First In First Out) eingearbeitet. Wird kein Ausdruck angegeben, wird ein Nullstring hinterlegt. ausdruck Kann ein Literal oder eine Variable sein, oder beides.
Beispiel:
REXX-Instruktion
QUEUE 'Alfred Neumann' QUEUE "August Nieselpriem" QUEUE "Fred Feuerstein" QUEUE Hat folgenden Inhalt des STACK zur Folge: Alfred Neumann August Nieselpriem Fred Feuerstein NULLSTRING
Kapitel 3 - Syntaxbeschreibung
405
QUEUED() QUEUED()
Übergibt die Gesamtanzahl der Sätze im aktiven Stackbereich.
Beispiel:
REXX-Funktion
/* REXX ***********************************************/ CALL SYSCLS SAY 'Dateinamen eingeben' datei = LINEIN() IF STREAM(datei,"C",QUERY EXISTS") = "" THEN EXIT DO WHILE LINES(datei) > 0 QUEUE LINEIN(datei) END SAY 'In' datei 'sind' queued() 'Datensätze gespeichert' DO QUEUED() PARSE PULL satz SAY satz END EXIT
406
REXX unter OS/2
RANDOM() RANDOM(
) min
,max
Liefert eine Zufallszahl zwischen 0 und 999, wenn max und min nicht angegeben ist. Diese beiden Werte können ansonsten die Streuung der Pseudo-Zufallszahl steuern. Der zwischen max und min liegende Bereich darf nicht größer als 100000 sein.
Beispiele:
REXX-Funktion
SAY RANDOM() SAY RANDOM(7,14) SAY RANDOM(5)
329 12 43
/ möglicherweise */ / möglicherweise */ / möglicherweise */
/* REXX **************************************/ CALL SYSCLS DO FOREVER SAY 'Zahlenraten, Eingabe (0 bis 9)' PULL zahl IF DATATYPE(zahl)='CHAR' ! zahl > 9 then exit IF zahl=RANDOM(,9) THEN SAY 'Treffer, OK' ELSE SAY 'Falsch geraten, Stuemper' END
Kapitel 3 - Syntaxbeschreibung
407
RD "RD
verzeichnis" laufwerk
Entfernt ein Verzeichnis, sofern es leer ist. laufwerk Laufwerksbezeichnung, auf dem das zu löschende Verzeichnis liegt (sofern es nicht auf dem aktuellen ist). verzeichnis Name des zu löschenden Verzeichnisses.
Hinweise: Ist das Verzeichnis nicht leer, wird die Operation nicht ausgeführt. In einer praktischen Anwendung wird man an dieser Stelle lieber SysRmDir aus der REXXUTIL.DLL einsetzen.
Beispiel:
OS/2-Befehl
/* REXX ******************************/ SAY "Name des zu löschenden Verzeichnisses?" PULL verz "RD" verz IF rc = 0 THEN SAY "Verzeichnis" verz "gelöscht" ELSE DO SAY "verz "konnte nicht gelöscht werden." say "Verzeichnis nicht leer, oder Verzeichnisname" SAY "falsch eingegeben." END :
408
REXX unter OS/2
REN "REN name_alt name_neu"
Umbenennen einer Datei oder eines Verzeichnisses. name_alt Name der Datei oder des Verzeichnisses, der geändert werden soll. name_neu
OS/2-Befehl
Neuer Name, der dem Verzeichnis oder der Datei zugewiesen werden soll.
Hinweis: Wildcards sind erlaubt.
Kapitel 3 - Syntaxbeschreibung
409
REORG "REORG TABLE tab IN dbk
" INDEX iname
USE pfad
Reorganisiert eine Tabelle in einer Datenbank. tab Name der Tabelle, die reorganisiert werden soll. dbk Name der Datenbank, die die Tabelle enthalten muß. iname Name des Index, der Grundlage für die Reorganisation sein soll. pfad Pfadangabe für temporäre Dateien, die während der Neuindizierung gebraucht werden. Fehlt diese Angabe, werden die Temporärdateien im gleichen Verzeichnis erzeugt, in dem auch die Datenbank liegt.
DB2/2-SQLDBS-Befehl
410
REXX unter OS/2
RETURN RETURN ausdruck
RETURN wird genutzt, um aus einer EXEC zu einer höherliegenden, beziehungsweise zurück zum Punkt des Aufrufes zu kommen. Dabei können Variablen oder Literale zurückgereicht werden. Existiert keine übergeordnete Prozedur, führt die Anwendung der Instruktionen RETURN und EXIT zum gleichen Ergebnis (die Prozedur wird beendet). ausdruck Können Variablen oder Literale in beliebiger Folge sein.
Beispiel:
REXX-Instruktion
/* REXX * PROG1 *********/ x=2 DO x x = x * x CALL prog2 x x=result SAY 'X:' x END EXIT
Bildschirmausgaben während des Ablaufes: X: X: X: X:
4 16 256 65536
/* REXX * PROG2 */ ARG x SAY "X:" x x=x*x RETURN X
Kapitel 3 - Syntaxbeschreibung
411
REVERSE() REVERSE(string)
Kehrt die Zeichenfolge eines Strings um. string Repräsentiert die Zeichenfolge in Form eines Literals oder einer Variablen, die umgekehrt werden soll.
SAY REVERSE('llot tsi XXER')
'REXX ist toll'
REXX-Funktion
Beispiel:
412
REXX unter OS/2
RIGHT() RIGHT(string,länge
) ,füllzeichen
Übergibt eine Zeichenfolge in der angegebenen Länge von rechts. Situationsabhängig wird nach der angegebenen Anzahl Byte auf der linken Seite abgeschnitten oder mit dem angegebenen Füllzeichen aufgefüllt (Standard ist BLANK). string Zeichenfolge, von der rechtsbündig die entsprechenden Zeichen zu übernehmen sind. länge Anzahl Bytes ab hinterster Position. Ist die Zeichenfolge kürzer als die angegebene Länge, wird sie auf die entsprechende Länge aufgefüllt. Ist die Zeichenfolge länger als die angegebene Länge, wird sie beschnitten. füllzeichen
REXX-Funktion
Sofern die Zeichenfolge kürzer der angegebenen Länge ist, wird sie mit dem angegebenen Füllzeichen aufgefüllt. Ist kein Füllzeichen angegeben, wird als Füllzeichen BLANK genutzt.
Beispiele: SAY SAY SAY SAY
RIGHT('Freibier',10) RIGHT('Freibier',10,'.') RIGHT('Hans ist doof',4) RIGHT('25',4,'0')
' Freibier' '..Freibier' 'doof' '0025'
Kapitel 3 - Syntaxbeschreibung
413
ROLLBACK "ROLLBACK
" WORK
Beendet eine UNIT of WORK und macht alle Änderungen, die seit Beginn der Unit of Work gamcht wurden, rückgängig.
Veränderungen, die durch COMMIT bereits "rechtskräftig" geworden sind, können mit ROLLBACK nicht mehr rückgängig gemacht werden. Nach Abschluß des ROLLBACK werden von DB2/2 alle Sperren frei.
DB2/2-SQLEXEC-Befehl
Hinweise:
414
REXX unter OS/2
RxFuncAdd() RxFuncAdd(aufruf_name,dll_name,funktions_name)
Zieht eine Funktion aus einer Dynamic-Link-Library an und macht sie unter einem beliebigen Namen unter OS/2 verfügbar. aufruf_name Der Name, unter dem die aus der DLL entnommene Funktion aufgerufen werden kann. dll_name Name einer Dynamic-Link-Library, aus der eine Funktion geladen werden soll. funktions_name Name der zu ladenden Funktion, wie er in der jeweiligen DLL hinterlegt ist. Hinweise: Aufrufname und Funktionsname können identisch sein, müssen aber nicht. In REXX gibt es eine ganze Reihe sogenannter Dienstprogrammfunktionen, die in der REXXUTIL.DLL geliefert werden. Diese Funktionen sind unter dem Namen SysLoadFuncs gemeinsam erreichbar (einzeln sind sie unter Namen wie SysCls oder SysDriveInfo ansprechbar). Um alle diese Funktionen zu aktivieren, müssen sie einmal in einer OS/2-Session angezogen werden (am besten in der STARTUP.CMD). Hier kann ein REXX-Zweizeiler zum gewünschten Ergebnis führen:
REXX-Funktion
Beispiele: /* REXX *****************************************/ call RXFUNCADD "LoadFuncs","REXXUTIL","SysLoadFuncs" call LoadFuncs EXIT Genausogut wäre auch /* REXX *****************************************/ x=RXFUNCADD("LoadFuncs","REXXUTIL","SysLoadFuncs") x=LoadFuncs() EXIT
Kapitel 3 - Syntaxbeschreibung
415
RxFuncDrop() RxFuncDrop(name)
Entfernt eine Funktion aus der Liste der verfügbaren Funktionen. name Name der Funktion, die nicht mehr benötigt wird.
Hinweis: Es ist im allgemeinen nicht ratsam, eine momentan nicht mehr benötigte Funktion aus der REXXUTIL.DLL auf diese Weise fallenzulassen. Über kurz oder lang wird man froh sein, wieder darauf zurückgreifen zu können und sie nicht erst wieder über RxFuncAdd() laden zu müssen.
: call RXFUNCDROP "RxMessageBox" : tmp=RXFUNCDROP("RxMessageBox") :
REXX-Funktion
Beispiel:
416
REXX unter OS/2
RxFuncQuery() RxFuncQuery(name)
Prüft, ob die Funktion in der Liste der verfügbaren Funktionen enthalten ist, oder nicht. Im JA-Fall wird eine 0 zurückgegeben, anderenfalls eine 1. name
REXX-Funktion
Name der Funktion, deren Verfügbarkeit überprüft werden soll.
Beispiel: : if rxfuncquery("DINGDONG") = 0 then say "Funktion DINGDONG ist verfügbar" else say "Funktion DINGDONG ist unbekannt" :
Kapitel 3 - Syntaxbeschreibung
417
RxMessgeBox() RxMessageBox(text
) ,
, titel
, knopf
symbol
Erzeugt ein Nachrichtenfenster. Die Funktion ist nur unter PMREXX oder einer PMAnwendung heraus aufrufbar. text Der auszugebende Meldungstext. titel Die Überschrift im Nachrichtenfenster, Standardtitel ist FEHLER knopf Regelt die Art und Anzahl der Druckknöpfe, die im Nachrichtenfenster gezeigt werden sollen. Möglich sind:
REXXUTIL-Funktion
Ok ........................Nur der Druckknopf wird gezeigt. OkCancel .............Je ein Druckknopf< OK> und (Cancel) wird gezeigt. Cancel ..................Ein Druckknopf für (cancel) wird angezeigt. Enter ....................Ein Druckknopf (Enter) wird sichtbar. EnterCancel .........In der Dialogbox erscheint ein Druckknopf für und einer für . RetryCancel .........Je ein Knopf für und (Cancel) wird ausgegeben. AbortRetryIgnore ..Es werden angezeigt: (Abort), (Retry) und (Ignore). YesNo ...................Es erscheint ein Konopf für (Yes) und einer für (No). YesNoCancel .......Die Druckknöpfe im Fenster heißen (Yes), (No) und (Cancel).
418
REXX unter OS/2
RxMessageBox() symbol Mit Ausgabe eines Textes und entsprechenden Drückknöpfen kann ein Symbol im Dialogfenster gezeigt werden. Durch nachfolgende Angaben werden gezeigt (hier irrt das OS/2-Handbuch): NONE HAND QUESTION EXCLAMATION ASTERISK INFORMATION QUERY WARNING ERROR
➪ ➪ ➪ ➪ ➪ ➪ ➪ ➪ ➪
Nichts Kreis mit Schrägstrich (Parkverbot) Fragezeichen im Kreis Ausrufezeichen im Dreieck i im Kreis i im Kreis Fragezeichen im Kreis Ausrufezeichen im Dreieck Kreis mit Schrägstrich (Parkverbot)
Rückmeldung Die Funktion liefert einen Wert zurück, der abhängig zum gedrückten Knopf folgende Bedeutung hat: 1 2 3 4 5 6 7 8
➪ ➪ ➪ ➪ ➪ ➪ ➪ ➪
REXXUTIL-Funktion
Beispiel: : if rc > 0 then do m="Programm fortsetzen" t="Returncode:" rc if RxMessageBox(m,t,"YesNo","Question")=7 then exit end :
Kapitel 3 - Syntaxbeschreibung
419
RxQueue() RxQueue(
"CREATE"
)
,queue-name "DELETE",queue-name "GET" "SET",neu-name
Erzeugt oder löscht eine Queue (Daten-Warteschlange) beziehungsweise weist ihr einen Namen zu oder ermittelt diesen. CREATE Erzeugt eine Queue. Wird kein Name angegeben oder existiert eine QUEUE gleichen Namens, vergibt REXX selbst einen. RXQUEUE liefert den Namen der Queue. DELETE queue-name Löscht die angegebene Queue und liefert einen Returncode folgender Bedeutung zurück: 0 5 9 10 12 1000
➪ ➪ ➪ ➪ ➪ ➪
Queue wurde gelöscht. Kein gültiger Queue-Name angegeben Angegebene Queue nicht vorhanden Queue wird benutzt Speicherfehler Initialisierungsfehler, OS/2.INI prüfen
GET Übergibt den Namen der aktuellen Queue. SET neu-name OS/2-Funktion
Positioniert auf eine neue QUEUE und liefert den alten Namen.
420
REXX unter OS/2
RxQueue() Beispiel:
/* REXX *************************************/ DO RANDOM(1,10) QUEUE "Gugus" END neu=RxQUEUE("CREATE") alt=RxQUEUE("SET,neu) DO RANDOM(1,10) QUEUE "Gaga" END SAY SAY "Sätze der 2. Schleife:" QUEUED() DO QUEUED() PARSE PULL satz SAY satz END CALL RxQUEUE "SET",alt CALL RxQUEUE "DELETE",neu SAY SAY "Sätze der 1. Schleife:" QUEUED() DO QUEUED() PARSE PULL satz SAY satz END EXIT
OS/2-Funktion
Zunächst werden 1-10 Sätze in die Standardqueue (SESSION) , dann 1-10 Sätze in eine neue Queue geschrieben. Die beiden Datenpakete werden in getrennten Verarbeitungsschritten wieder ausgegeben.
Kapitel 3 - Syntaxbeschreibung
421
SAY SAY ausdruck
Schreibt den angegebenen Ausdruck an die Standardzuordnung für Output (im Allgemeinen der Bildschirm), wobei enthaltene Variablen vor Ausgabe aufgelöst werden. Der Ausdruck kann beliebig lang sein. Wird die SAY-Instruktion ohne Ausdruck angegeben, wird eine Leerzeile erzeugt. ausdruck Literal oder Variable in beliebiger Anzahl und Reihenfolge.
Beispiel:
Führt zur Anzeige: 100 dividiert durch 4 = 25
REXX-Instruktion
: zahl=100 say zahl 'dividiert durch 4 =' zahl/4 :
422
REXX unter OS/2
SELECT SELECT
WHEN ausdruck THEN instruktion
OTHERWISE instruktion
END
Sind innerhalb eines Verarbeitungsabschnittes mehrere Bedingungen zu überprüfen, die sich gegenseitig ausschließen sollen, kann dies grundsätzlich durch in sich geschachtelte IF-THEN-ELSE-Anweisungen bewerkstelligt werden. Die SELECTAnweisung bietet hier aber eine wesentliche Vereinfachung. An eine Bedingung geknüpft kann nur je eine Instruktion kodiert werden. Müssen von der Ablauflogik her mehrere Befehle ausgeführt werden, sind sie als Befehlsfolge zwischen DO und END zusammenzufassen. SELECT Leitet die Mehrfachabfrage ein. WHEN ausdruck THEN instruktion Fragt nach einer Bedingung. Ist sie wahr, wird der Befehl hinter THEN ausgeführt. Wenn nicht, wird in der Mehrfachabfrage zum nächsten WHEN verzweigt. Ist keine weitere Frage kodiert, wird der NEIN-Zweig der Abfrage angesteuert oder die Mehrfachabfrage verlassen.
REXX-Instruktion
OTHERWISE instruktion Ist der NEIN-Zweig der Mehrfachabfrage. Er wird durchlaufen, wenn alle vorangegangenen Fragen verneint wurden. OTHERWISE ist nicht in allen Interpreterversionen zwingend zu kodieren. Unter MVS-TSO/E wird das Fehlen von OTHERWISE aber meist als Syntaxfehler reklamiert. Wird der NEIN-Zweig von der Programmlogik her nicht benötigt, wird in Verbindung mit OTHERWISE die Instruktion NOP (No OPeration) eingesetzt.
Kapitel 3 - Syntaxbeschreibung
423
SELECT Beispiele: /* REXX ***************************************/ CALL SysCls SAY 'Geben Sie Ihr Alter an' PULL alter SELECT WHEN alter < 18 THEN txt='noch in die Schule' WHEN alter > 65 THEN txt='nach Mallorca' OTHERWISE txt='sofort an die Arbeit' END SAY 'Sie gehören' txt EXIT
REXX-Instruktion
/* REXX ***************************************/ CALL SysCls SAY 'Geben Sie Ihr Alter an' PULL alter SELECT WHEN DATATYPE(alter) = "CHAR" THEN EXIT WHEN alter < 18 THEN DO txt.1 = "Nimm den Schnuller aus dem Mund" txt.2 = "Du gehoerst noch in die Schule" txt.0 = 2 END WHEN alter > 65 THEN DO txt.1 = "Der Kalk rieselt Ihnen aus dem Hosenbein" txt.2 = "Bitte treten Sie einen Schritt zurueck," txt.3 = "sonst verstauben meine Module!" txt.4 = "" txt.5 = "Fahren Sie lieber nach Mallorca" txt.0 = 5 END OTHERWISE DO txt.1 ="Haben Sie sonst nichts zu tun?" txt.0 = 1 END END DO cnt = 1 to txt.0 SAY txt.cnt END EXIT
424
REXX unter OS/2
SELECT ,
SELECT
liste FROM
tab
ALL DISTINCT WHERE bedingung GROUP BY HAVING bedingung ORDER BY
UNION EXCEPT INTERSECT
, spalte , name nummer
ASC DESC
ALL
Selektiert Datensätze aus einer Tabelle. Wir innerhalb eines SELECT-Befehles als bedingung ein weiterer SELECT kodiert, sprechen wir dort von einem SUBSELECT. Aus der Vielzahl der möglichen Angaben im SELECT wollen wir hier nur einige herausgreifen und bitten um Verständnis, daß wir nicht alle Details zu SELECT liefern. Die Beschreibung dieses Befehles würde sich sicher über mehr als 10 Seiten hinziehen. Die DB2/2-Insider möchten wir an dieser Stelle auf die IBM-Literatur verweisen. ALL
DB2/2-SQLEXEC-Befehl
Alle Sätze wandern in die Ergebnistabelle. DISTINCT Doppelte Zeilen aus der originären Tabelle werden nicht in die Ergebnistabelle übernommen (der Parameter darf nur einmal je SUBSELECT kodiert werden).
Kapitel 3 - Syntaxbeschreibung
425
SELECT liste Bestimmt, mit welchen Spalten die Ergebnistabelle aufgebaut werden soll.Maximal können bis zu 255 Spalten angegeben werden. Folgende Angaben für liste sind möglich: * (Stern) Alle Spalten der Originärtabelle werden namensgleich der Reihe nach für die Ergebnistabelle benutzt. name.* Alle Spalten, deren Name oder Alias dem Stern vorangestellt wurden, werden der Reihe nach in die Ergebnistabelle übernommen. spaltenname Die Ergebnistabelle wird entsprechend der Angabe der Spaltennamen aufgebaut. Die Spalten müssen in der originären Tabelle vorhanden sein. ausdruck Ein Ausdruck kann aus Spaltennamen, Konstanten und Funktionen bestehen. Ausgegeben wird das Resultat des Ausdruckes. Arithmetische Operatoren dürfen nur mit numerischen Werten benutzt werden. Als Operanden können benutzt werden: Addition(+), Subtraktion(-), Multiplikation(*) und Division(/) Liefert die Anzahl der Datensätze (SELECT COUNT(*)) Liefert den Durchschnitt einer Zahlenreihe. Liefert die Summe einer Zahlenreihe. Liefert die größte Zahl aus einer Zahlenreihe. Liefert die kleinste Zahl aus einer Zahlenreihe.
FROM tab Zeigt auf die Originärtabelle, die durchsucht wird und die die Ergebnisse für die Ergebnistabelle liefert. Es können maximal 15 Tabellen angegeben werden.
DB2/2-SQLEXEC-Befehl
COUNT AVG ...... SUM ..... MAX ..... MIN ......
426
REXX unter OS/2
SELECT WHERE bedingung Es werden nur die Datensätze in die Ergebnistabelle übernommen, die die angegebene Bedingung erfüllen. In der Auswahlbedingung können enthalten sein: ❍
Einfache Vergleiche mit den Operatoren =, >, >=,