Neben den Prozedurparametern, die beim Aufruf der Prozedur erzeugt werden und einen Wert erhalten, gibt es die sog. S-Variablen, die an beliebiger Stelle innerhalb einer Prozedur erzeugt werden können. Dies geschieht explizit durch das Kommando DECLARE-VARIABLE, implizit durch die erste Zuweisung eines Wertes an die Variable (sofern dies nicht durch die Option IMPLICIT-DECLARATION=*NO im Kommando SET-PROCEDURE-OPTIONS unterbunden wurde) oder automatisch während der Ausführung einiger spezieller Kommandos (wie z.B. OPEN-VARIABLE-CONTAINER oder EXECUTE-CMD).
Bei expliziter Deklaration kann, ähnlich wie bei Parametern, für die Variablen ein Typ und auch ein Anfangswert (INITIAL-VALUE) vereinbart werden.
Die Namen (einfacher) S-Variablen dürfen bis zu 20 Zeichen lang sein und gemäß den Regeln für den SDF-Datentyp <structured-name> aus Buchstaben, Ziffern und Bindestrichen bestehen. Die mit SYS beginnenden Namen sind der Systemsoftware vorbehalten; einige weitere Namen sind für Rechenoperatoren und boolesche Konstanten reserviert.
Wertzuweisung
Der Wert einer Variablen kann durch verschiedene Kommandos und auch durch Programme verändert werden. Dies gilt übrigens auch für Prozedurparameter, die während der Ausführung der Prozedur wie normale S-Variablen behandelt werden.
Insbesondere ist das Kommando SET-VARIABLE dazu vorgesehen, einer Variablen einen neuen Wert zuzuweisen. Da der Name dieses Kommandos nicht nur nach den üblichen Regeln abgekürzt, sondern auch ganz weggelassen werden darf, lassen sich Zuweisungen an Variable in der von Programmiersprachen her bekannten Form schreiben:
/ variablenname = neuer-wert
Konstanten
Die Werte, die den Variablen zugewiesen werden, können unter anderem konstante Zeichenfolgen, Zahlen oder boolesche (Wahrheits-) Werte sein.
Konstante Zeichenfolgen (bezeichnet als STRING-Typ) werden in Hochkommata (einfache Anführungszeichen) eingeschlossen, wobei jedes darin enthaltene Hochkomma und jedes &-Zeichen zu verdoppeln ist. Groß- und Kleinbuchstaben werden unterschieden.
Alternativ können Zeichenfolgen auch in hexadezimaler Schreibweise (als sog. X-Strings) angegeben werden, um die Darstellung nichtabdruckbarer Zeichen zu ermöglichen. Die beiden folgenden Kommandos sind daher gleichwertig:
/ DATEI = 'ARB.4' / DATEI = X'C1D9C24BF4'
Ganze Zahlen (Typ INTEGER) können als dezimale Konstanten aus dem Wertebereich -231 .. +231-1 dargestellt werden; das positive Vorzeichen ist optional.
Boolesche Konstanten (Typ BOOLEAN) werden durch die Schlüsselwörter TRUE bzw. FALSE bezeichnet. Alternativ können auch die Namen YES und ON bzw. NO und OFF benutzt werden.
Variablentypen
Eine Variable nimmt nach einer Wertzuweisung immer den Typ des zugewiesenen Wertes an (also STRING, INTEGER oder BOOLEAN). Um fehlerhafte Zuweisungen frühzeitig zu erkennen und damit die Ablaufsicherheit der Prozeduren zu verbessern, kann bei der Deklaration von Variablen mit dem TYPE-Operanden festgelegt werden, dass die Variable nur Werte eines bestimmten Typs annehmen darf; andere Zuweisungen führen dann zu einem Fehler.
Geltungsbereiche
Eine Variable existiert normalerweise nur innerhalb der Prozedur, in der sie (explizit oder implizit) deklariert wurde. Wenn die Prozedur beendet wird, endet auch die Lebensdauer der Variablen. Wenn mehrere Aufrufe derselben oder auch unterschiedlicher Prozeduren innerhalb einer Task mit derselben Variable arbeiten und diese jeweils ihren Wert weiterhin behalten soll, kann durch eine explizite Deklaration mit der Angabe SCOPE=*TASK eine sog. Taskvariable eingerichtet werden, die von verschiedenen Prozeduren aus benutzt werden kann.
Wenn aus einer Prozedur heraus eine weitere Prozedur aufgerufen wird und beide mit Variablen gleichen Namens arbeiten, so werden diese Variablen grundsätzlich völlig getrennt voneinander angelegt und verwaltet. Nur wenn eine Prozedur über das Kommando INCLUDE-PROCEDURE aufgerufen wird, hat sie die Möglichkeit, mit der Angabe SCOPE= *PROCEDURE in Deklarationen auf den Variablenbereich der rufenden Prozedur zuzugreifen und dort beispielsweise Variablen anzulegen oder zu modifizieren.
Variablencontainer
Normalerweise werden die Definitionen und die Werte der Variablen im privilegierten Speicher der Task aufbewahrt und am Ende der Lebensdauer der Variablen gelöscht. Es gibt jedoch zwei Möglichkeiten, andere Speichermedien zu nutzen: Durch eine Deklaration mit dem Operanden CONTAINER=*JV kann der Variablenwert in einer Jobvariablen abgelegt werden; er bleibt damit auch längerfristig erhalten und kann zudem durch JV-Zugriffe auch von anderen Tasks her abgefragt und verändert werden.
Gibt man bei der Deklaration einer Variablen einen Container an, der in einer Bibliothek angelegt wurde (mit dem Kommando OPEN-VARIABLE-CONTAINER), so werden sowohl die Beschreibung der Variablen als auch ihr Wert auf Anforderung durch das Kommando SAVE-VARIABLE-CONTAINER oder auf Wunsch automatisch bei Beendigung der Prozedur bzw. der Task in der Bibliothek gespeichert und können in einem anderen Prozedurlauf erneut verwendet werden.