La portée des variables Macro : Ne confondez pas la mémoire de Skynet avec celle d'un T-800

Grosse frayeur hier au centre de commandement. Skynet avait défini les coordonnées d'une frappe nucléaire (une variable nommée &Cible). Au même moment, un simple T-800 en mission d'infiltration a exécuté une sous-routine qui utilisait aussi une variable nommée &Cible pour viser un pigeon. Résultat : Skynet a failli vaporiser le pigeon avec un missile balistique intercontinental.

Le diagnostic est clair : un problème de portée des variablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage. (Scope).

Pour la certification SAS 9 Advanced, comprendre où vivent et meurent vos variablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage. Macro est vital. Il existe deux espaces de stockage distincts : la Global Symbol Table (la mémoireGemini said
Espace de stockage temporaire (RAM) utilisé par le moteur CAS pour charger et traiter les données à haute vitesse, minimisant les accès disque pour optimiser les performances de SAS Viya.
centrale) et les Local Symbol Tables (la mémoireGemini said
Espace de stockage temporaire (RAM) utilisé par le moteur CAS pour charger et traiter les données à haute vitesse, minimisant les accès disque pour optimiser les performances de SAS Viya.
temporaire de vos macros).

1. Les VariablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage. Globales : La mémoireGemini said
Espace de stockage temporaire (RAM) utilisé par le moteur CAS pour charger et traiter les données à haute vitesse, minimisant les accès disque pour optimiser les performances de SAS Viya.
centrale de Skynet

Une variable globale est disponible partout, tout le temps, depuis sa création jusqu'à la fermeture de votre sessionInstance de connexion active entre un client et le serveur CAS (Cloud Analytic Services), isolant les ressources, les bibliothèques et les traitements d'un utilisateur au sein de SAS Viya. SAS. C'est le niveau d'autorité maximum.

Comment crée-t-on une variable globale ?

  • En utilisant %LET en plein air (c'est-à-dire en dehors de toute définition %MACRO).
  • En utilisant CALL SYMPUTX dans une étape DATA (sans spécifier d'argument de portée).
1
2
3
4
/* Ceci est une variable Globale */
%let Cible_Globale = Centre de la Résistance;

%put La cible de Skynet est le &Cible_Globale;

2. Les VariablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage. Locales : La mémoireGemini said
Espace de stockage temporaire (RAM) utilisé par le moteur CAS pour charger et traiter les données à haute vitesse, minimisant les accès disque pour optimiser les performances de SAS Viya.
RAM d'un Terminator

Une variable locale naît au moment où une Macro est exécutée, et elle est détruite à la seconde où la Macro se termine (au %MEND). Elle n'existe qu'à l'intérieur de sa bulle.

Comment crée-t-on une variable locale ?

  • En définissant des paramètres dans une Macro.
  • En utilisant une boucle %DO (l'indexStructure de données accélérant la lecture des lignes d'une table en ciblant directement les valeurs des colonnes indexées, réduisant ainsi les entrées/sorties disque et le temps de traitement. de la boucle devient local).
1
2
3
4
5
6
7
8
9
%macro Assaut(Secteur);
/* &Secteur est une variable strictement locale ! */
%put Déploiement des troupes dans le secteur : &Secteur;
%mend;

%Assaut(Los Angeles)

/* Si Skynet essaie de lire la variable en dehors de la macro, ça plante ! */
%put &Secteur; /* ERREUR : Variable non résolue */

3. Le piège mortel de l'examen : Le conflit de noms

C'est ici que les concepteurs de la certification SAS vont essayer de vous piéger. Que se passe-t-il si vous utilisez un %LET à l'intérieur d'une macro ? Crée-t-il une variable locale ou globale ?

La réponse est : Ça dépend ! SAS applique une règle stricte :

  1. SAS regarde si la variable existe déjà dans la table Globale.
  2. Si OUI, SAS met à jour la variable Globale (il ne crée pas de locale).
  3. Si NON, SAS crée une nouvelle variable Locale.

Regardez ce code diabolique :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
%let Statut = En attente; /* Création d'une variable Globale */

%macro Piratage;
/* SAS voit qu'une variable globale Statut existe, il l'écrase ! */
%let Statut = Détruit;

/* SAS voit que Niveau n'existe nulle part, il crée une Locale */
%let Niveau = Alerte Rouge;
%mend;

%Piratage

%put Statut final : &Statut; /* Affiche : Détruit ! (Skynet a perdu sa donnée) */
%put Niveau : &Niveau; /* Affiche : &Niveau (La locale a été effacée) */

4. Reprendre le contrôle avec %GLOBAL et %LOCAL

Pour éviter que vos T-800 ne réécrivent par accident la mémoireGemini said
Espace de stockage temporaire (RAM) utilisé par le moteur CAS pour charger et traiter les données à haute vitesse, minimisant les accès disque pour optimiser les performances de SAS Viya.
centrale de Skynet, vous devez déclarer vos intentions de manière explicite.

  • %LOCAL : Force SAS à créer une variable dans la bulle de la Macro, même si une variable globale du même nom existe déjà. C'est un bouclier protecteur.
  • %GLOBAL : Permet à une Macro de créer une variable directement dans la mémoireGemini said
    Espace de stockage temporaire (RAM) utilisé par le moteur CAS pour charger et traiter les données à haute vitesse, minimisant les accès disque pour optimiser les performances de SAS Viya.
    centrale, disponible pour tout le monde après son exécution.

Corrigeons notre erreur précédente :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
%let Statut = En attente;

%macro Piratage_Securise;
/* On protège la mémoire centrale ! */
%local Statut;

/* On force la création d'une globale depuis l'intérieur ! */
%global Nouvelle_Menace;

%let Statut = Détruit; /* Modifie uniquement la locale */
%let Nouvelle_Menace = John Connor;
%mend;

%Piratage_Securise

%put Statut final : &Statut; /* Affiche : En attente (La globale est intacte !) */
%put Menace : &Nouvelle_Menace; /* Affiche : John Connor */

Le conseil Certification

Il y a une exception à la règle du "conflit de noms" : Les paramètres de Macro. Si une Macro possède un paramètre qui a le même nom qu'une variable globale, SAS créera toujours une version locale du paramètre. Le paramètre agit comme un %LOCAL automatique, protégeant ainsi la variable globale d'origine.

Conclusion

La maîtrise des portées Globales et Locales est ce qui sépare un bidouilleur de code d'un véritable ingénieur Skynet. En utilisant %LOCAL au début de vos macros complexes, vous vous assurez qu'elles n'auront jamais d'effets de bord imprévus sur le reste de vos programmes.

Mais maintenant que Skynet a des macros parfaitement sécurisées, il serait dommage de devoir les recompiler à chaque fois qu'on redémarre le système. Dans l'Article 10, nous verrons comment ranger votre chambre et sauvegarder vos Macros de manière permanente avec les catalogues compilés et les bibliothèquesPointeurs logiques (Libref) reliant SAS Viya à des sources de données physiques (dossiers, bases de données, CAS) pour lire, écrire et organiser les tables de manière structurée. Autocall.

Nicolas Housset

Passionné d'informatique, je suis Consultant et expert technique SAS VIYA, également co-fondateur de la société Flexcelite. Spécialisé dans les technologies SAS (Viya, 9.4) et les infrastructures associées (Linux, Hadoop, Azure), ce blog est mon espace pour partager mes mémos techniques et retours d'expérience.