Promotion de tables CAS : Comprendre le "Scope" et éviter l'erreur "Table not found"
Simon 43 vistas
Nivel de dificultad
Confirmé
Publicado el :
Consejo del experto
Michael
L'erreur classique est de confondre la persistance en mémoire avec la visibilité : rappelez-vous que chaque session CAS est un conteneur hermétique tant que la promotion n'est pas actée. Pour industrialiser vos flux, abandonnez les étapes séquentielles au profit d'un bloc CASL atomique ; c'est la seule méthode garantissant que le nettoyage de l'ancienne version et la mise à disposition de la nouvelle se font sans rupture de service ni erreur de session.
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";
Aviso importante
Los códigos y ejemplos proporcionados en WeAreCAS.eu son con fines educativos. Es imperativo no copiarlos y pegarlos ciegamente en sus entornos de producción. El mejor enfoque es comprender la lógica antes de aplicarla. Recomendamos encarecidamente probar estos scripts en un entorno de prueba (Sandbox/Dev). WeAreCAS no acepta ninguna responsabilidad por cualquier impacto o pérdida de datos en sus sistemas.
SAS y todos los demás nombres de productos o servicios de SAS Institute Inc. son marcas registradas o marcas comerciales de SAS Institute Inc. en los EE. UU. y otros países. ® indica registro en los EE. UU. WeAreCAS es un sitio comunitario independiente y no está afiliado a SAS Institute Inc.
Este sitio utiliza cookies técnicas y analíticas para mejorar su experiencia.
Saber más.