Promotion de tables CAS : Comprendre le "Scope" et éviter l'erreur "Table not found"
Simon 43 Aufrufe
Schwierigkeitsgrad
Confirmé
Veröffentlicht am :
Expertenrat
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";
Wichtiger Haftungsausschluss
Die auf WeAreCAS.eu bereitgestellten Codes und Beispiele dienen Lehrzwecken. Es ist zwingend erforderlich, sie nicht blind in Ihre Produktionsumgebungen zu kopieren. Der beste Ansatz besteht darin, die Logik zu verstehen, bevor sie angewendet wird. Wir empfehlen dringend, diese Skripte in einer Testumgebung (Sandbox/Dev) zu testen. WeAreCAS übernimmt keine Verantwortung für mögliche Auswirkungen oder Datenverluste auf Ihren Systemen.
SAS und alle anderen Produkt- oder Dienstleistungsnamen von SAS Institute Inc. sind eingetragene Marken oder Marken von SAS Institute Inc. in den USA und anderen Ländern. ® zeigt die Registrierung in den USA an. WeAreCAS ist eine unabhängige Community-Site und nicht mit SAS Institute Inc. verbunden.
Diese Website verwendet technische und analytische Cookies, um Ihre Erfahrung zu verbessern.
Mehr erfahren.