CAS

SAS Viya : Comment gérer proprement la création et la suppression de CASLIBs

Simon 26/03/2024 15 vues

Lors de l'automatisation de tâches dans SAS© Viya, il est courant d'utiliser des macros pour configurer des sources de données. Un cas classique consiste à boucler sur une liste de domaines d'authentification (par exemple pour Oracle) afin de créer dynamiquement des CASLIBs.

Cependant, une difficulté survient souvent lorsque l'on doit exécuter ce code plusieurs fois : la gestion des doublons.

Illustration

Le Problème : Le dilemme de l'œuf et de la poule

Imaginez un scénario où votre macro parcourt une liste pour créer des connexions.

  1. Première exécution : Tout fonctionne parfaitement. Les CASLIBs sont créés.

  2. Seconde exécution : Le système renvoie une erreur fatale car les CASLIBs existent déjà (ERROR: Duplicate Caslib).

La réaction naturelle est d'ajouter une instruction pour supprimer (DROP) la bibliothèque avant de la recréer. Mais cela crée un nouveau problème : lors de la toute première exécution, ou si la session est neuve, la bibliothèque n'existe pas encore. Résultat ? Une erreur dans le journal (ERROR: The caslib ... does not exist).

Bien que l'on puisse ignorer cette erreur, elle pollue le journal (log) et peut masquer de vrais problèmes. L'objectif est d'avoir un code "propre" qui s'exécute sans erreur, quel que soit l'état initial.

La Solution : Vérifier avant d'agir

La méthode la plus robuste pour contourner ce problème est d'utiliser la fonction CLIBEXIST.

Cette fonction permet de vérifier l'existence d'une CASLIB dans la session actuelle avant de tenter une action. Si la bibliothèque existe, on la supprime pour la recréer proprement. Si elle n'existe pas, on passe directement à la création.

Implémentation du code

Voici comment intégrer cette logique dans votre boucle macro. L'astuce consiste à envelopper l'instruction DROP dans une condition %IF qui appelle CLIBEXIST.

1/* Exemple de macro boucle pour gérer les connexions Oracle */
2%macro ora_libs;
3 %local i authdomain schema;
4
5 /* Boucle sur la liste des domaines d'authentification */
6 %DO i=1 %to %sysfunc(countw(&auth_list));
7 %let authdomain = %scan(&auth_list, &i);
8 %let schema = &authdomain.;
9 
10 /* C'est ici que la magie opère : */
11 /* On vérifie si la CASLIB existe déjà dans la session active (ici 'mysession') */
12
13 %IF %sysfunc(clibexist(mysession, &schema)) %THEN %DO;
14 caslib &schema. drop;
15 %END;
16 
17 /* Création de la CASLIB propre et sans erreur */
18 caslib &schema. datasource=(
19 srctype="oracle",
20 authdomain=&authdomain.
21 path=&path.
22 schema=&schema.
23 );
24 %END;
25%mend;

Pourquoi c'est important ?

L'utilisation de CLIBEXIST rend votre code idempotent. Cela signifie que vous pouvez l'exécuter une fois ou cent fois, le résultat final sera le même (les bibliothèques sont configurées) et, surtout, votre journal d'exécution restera vert, sans messages d'erreur rouges inquiétants.

C'est une petite modification qui améliore grandement la qualité et la maintenabilité de vos programmes SAS© Viya.