CAS

Promotion de tables CAS : Comprendre le "Scope" et éviter l'erreur "Table not found"

Simon 24/05/2024 5 vues

Dans SAS© Viya, le partage de données entre utilisateurs repose sur un concept clé : la promotion. Une table chargée en mémoire est par défaut visible uniquement par vous (Session Scope). Pour la rendre publique, vous devez la promouvoir (Global Scope).

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 :

  1. Vous chargez une table MaTable dans une session (disons Session A).

  2. Vous lancez un nouveau script commençant par cas MySession;.

  3. 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.


La Solution Robuste : Tout faire en CASL

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).

Illustration
Note :
Le Code Universel
Voici le script optimisé qui gère le nettoyage et la promotion en tenant compte de votre version de Viya.
1PROC 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 */
13 TABLE.partition /
14 TABLE={caslib="Public", name="GL_PERIODS_Local"} /* Table source (session) */
15 casout={caslib="Public", name="GL_PERIODS_Global", promote=TRUE};
16 
17 /* --- Option B : Pour Viya 2020.1 (Viya 4) et plus récents --- */
18 /* L'action copyTable est plus explicite et recommandée */
19 /*
20 table.copyTable /
21 table={caslib="Public", name="GL_PERIODS_Local"}
22 casout={caslib="Public", name="GL_PERIODS_Global", promote=TRUE};
23 */
24QUIT;
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";