Wenn man mit SAS© Viya™ anfängt, stößt man häufig auf verschiedene Syntaxen, um eine scheinbar identische Aufgabe auszuführen: eine SAS©-Bibliothek mit einer Caslib zu verbinden. Eine häufige Verwirrung tritt bei der Initialisierung einer Sitzung und der Zuweisung eines libref auf.
Soll man die Caslib nur in den Sitzungsoptionen (SESSOPTS) definieren oder muss man sie in der LIBNAME-Anweisung erneut explizit angeben? Analysieren wir die zugrunde liegenden Mechanismen, um die Funktionalität von bewährten Verfahren zu unterscheiden.
Betrachten wir die folgenden beiden Code-Auszüge, die anscheinend dieselbe Aktion ausführen (die Tabelle sashelp.cars in den Speicher laden):
Ansatz A:
Der Unterschied liegt in der zweiten Zeile. In Ansatz B wird die Option caslib=casuser in der LIBNAME-Anweisung wiederholt, obwohl sie bereits kurz zuvor in der CAS-Anweisung (SESSOPTS) definiert wurde. Ist Ansatz A unvollständig? Ist Ansatz B redundant?
Um diese Frage zu beantworten, muss man verstehen, wie SAS© Viya™ den Sitzungskontext verwaltet:
Initialisierung: Wenn Sie eine CAS-Sitzung mit SESSOPTS=(caslib=casuser) starten, definieren Sie casuser als die aktive Caslib.
Einzigartigkeit: Es gibt zu jedem Zeitpunkt nur eine aktive Caslib in einer Sitzung.
Standard-Vererbung: Wenn eine nachfolgende Anweisung eine Caslib benötigt, Sie diese aber nicht angeben, verwendet SAS© standardmäßig die aktive Caslib.
Folglich ist Ansatz A technisch korrekt. Da die Anweisung libname mycase cas; kein Ziel angibt, verbindet sich die CAS-Engine automatisch mit der zuvor definierten aktiven Caslib (hier casuser). Die beiden Codes sind also zum Zeitpunkt T funktional äquivalent.
Wenn der Code ohne Wiederholung funktioniert, warum empfehlen viele Experten und die Dokumentation dann Ansatz B (explizite Angabe)?
Dafür gibt es zwei Hauptgründe:
1. Klarheit und Lesbarkeit
Für jemanden, der den Code liest, ist die Anweisung libname mycase cas caslib=casuser; eindeutig. Sie deklariert explizit die Verbindung zwischen dem libref und der Datenquelle, unabhängig davon, was 50 Zeilen weiter oben in einer Sitzungsoption definiert wurde. Es ist eine klare Absichtserklärung.
2. Bindung (Binding) und Sicherheit
Dies ist das stärkste technische Argument. Die explizite Bindung des libref an die Caslib verhindert unerwartetes Verhalten, wenn sich der Kontext ändert.
Stellen Sie sich vor, weiter unten in Ihrem Programm wird die aktive Caslib geändert (z. B. durch eine neue CAS-Anweisung oder eine Systemoption).
Ohne explizite Option (Ansatz A): Da die CAS-Engine dynamisch ist, könnte Ihr LIBNAME plötzlich auf die neue aktive Caslib verweisen, ohne dass Sie es merken.
Mit expliziter Option (Ansatz B): Der libref bleibt an die Caslib casuser "gebunden" (bound), unabhängig davon, welche Änderungen an der aktiven Caslib später in der Sitzung auftreten.
Obwohl das Weglassen der CASLIB-Option in der LIBNAME-Anweisung dank des Mechanismus der "aktiven Caslib" syntaktisch zulässig ist, wird dringend empfohlen, sie systematisch einzubeziehen.
Dies macht Ihren Code robuster gegenüber Kontextänderungen und lesbarer für Ihre Kollegen. In der SAS© Viya™-Programmierung wie auch anderswo ist "explizit" oft besser als "implizit".