Cependant, il arrive souvent que l'instruction promote échoue avec un message frustrant :
ERROR: There is no session-scope table X in caslib Public...
Pourtant, vous êtes sûr d'avoir chargé cette table ! Analysons pourquoi cela arrive et comment le résoudre proprement avec CASL.
Le Problème : "Session Scope" vs "Global Scope"
L'erreur survient généralement à cause d'une confusion sur la durée de vie d'une session CAS.
Regardez ce scénario typique qui échoue :
Vous chargez une table MaTable dans une session (disons Session A).
Vous lancez un nouveau script commençant par cas MySession;.
Vous tentez de promouvoir MaTable.
Pourquoi ça plante ?
L'instruction cas MySession; démarre souvent une nouvelle session (Session B). La Session B est totalement isolée de la Session A. Elle ne peut pas "voir" MaTable qui se trouve dans la mémoire de la Session A. Pour promote, la table n'existe tout simplement pas.
Plutôt que d'utiliser PROC CASUTIL de manière séquentielle (qui peut masquer des changements de session), l'approche recommandée par les experts (comme SASJedi) est d'utiliser un bloc PROC CAS. Cela permet de gérer la suppression de l'ancienne version globale et la promotion de la nouvelle en une seule transaction logique.
De plus, selon votre version de Viya™, l'action à utiliser diffère légèrement pour copier et promouvoir une table simultanément (par exemple pour la renommer au passage).
Note :
Le Code Universel
Voici le script optimisé qui gère le nettoyage et la promotion en tenant compte de votre version de Viya™.
proc cas;
/* 1. Nettoyage : On supprime l'ancienne version globale si elle existe */
/* L'option quiet=TRUE évite une erreur si la table n'existe pas encore */
table.dropTable /
caslib="Public"
name="GL_PERIODS_Global" /* Nom final de la table publique */
quiet=TRUE;
/* 2. Promotion : Copie de la table de session vers une table globale */
/* --- Option A : Pour Viya 3.4 et 3.5 --- */
/* On utilise table.partition comme astuce pour copier + promouvoir */
table.partition /
table={caslib="Public", name="GL_PERIODS_Local"} /* Table source (session) */
casout={caslib="Public", name="GL_PERIODS_Global", promote=TRUE};
/* --- Option B : Pour Viya 2020.1 (Viya 4) et plus récents --- */
/* L'action copyTable est plus explicite et recommandée */
/*
table.copyTable /
table={caslib="Public", name="GL_PERIODS_Local"}
casout={caslib="Public", name="GL_PERIODS_Global", promote=TRUE};
*/
quit;
1
PROC CAS;
2
/* 1. Nettoyage : On supprime l'ancienne version globale si elle existe */
3
/* L'option quiet=TRUE évite une erreur si la table n'existe pas encore */
4
TABLE.dropTable /
5
caslib="Public"
6
name="GL_PERIODS_Global"/* Nom final de la table publique */
7
quiet=TRUE;
8
9
/* 2. Promotion : Copie de la table de session vers une table globale */
10
11
/* --- Option A : Pour Viya 3.4 et 3.5 --- */
12
/* On utilise table.partition comme astuce pour copier + promouvoir */
Pourquoi cette méthode fonctionne mieux ?
Atomicité : Tout se passe dans la même procédure.
Renommage : Contrairement à un simple promote, cette méthode (partition ou copyTable) crée une nouvelle copie physique. Cela vous permet de garder votre table de travail (_Local) intacte tout en publiant une version propre (_Global).
Gestion des versions : En Viya™ 3.5, l'action table.partition était souvent utilisée détournée de sa fonction première pour réaliser cette copie-promotion efficace.
3 Bonnes Pratiques à retenir
Un seul script, une seule session : Assurez-vous que le chargement des données (Load) et leur promotion (Promote) se font dans le même flux d'exécution ou la même session CAS.
Vérifiez l'existence : Avant de promouvoir, assurez-vous que votre table source est bien en mémoire ("Loaded"). Si votre session a expiré (timeout), la table a disparu de la RAM.
Connexion par UUID : Si vous devez absolument récupérer une table laissée dans une session orpheline, vous devez vous reconnecter à cette session précise en utilisant son UUID :
cas mysess uuid="ca683ddf-fe18-3c48-a04e-45718220976d";
Avertissement important
Les codes et exemples fournis sur WeAreCAS.eu sont à but pédagogique. Il est impératif de ne pas les copier-coller aveuglément sur vos environnements de production. La meilleure approche consiste à comprendre la logique avant de l'appliquer. Nous vous recommandons vivement de tester ces scripts dans un environnement de test (Sandbox/Dev). WeAreCAS décline toute responsabilité quant aux éventuels impacts ou pertes de données sur vos systèmes.
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.