Publié le :
Macro EXTERNE

Macro DBMSlist - Requêtage de base de données par lots

Ce code est également disponible en : Deutsch English Español
En attente de validation
Cette macro automatise le processus de 'chunking'. Elle compte d'abord le nombre total d'observations dans le jeu de données source (`dsn`). Ensuite, elle itère par blocs (taille définie par `bitesize`). À chaque itération, elle crée une table temporaire (`gwhxxxx2`), appelle deux macros externes (`%MakeList` pour formater la liste des valeurs, et `%RunQuery` pour exécuter la requête SQL) et agrège les résultats dans la table cible (`newdsn`) via `PROC APPEND`. Le script gère également un mode test pour n'exécuter qu'une seule itération.
Analyse des données

Type : EXTERNE


La macro attend un dataset en entrée via le paramètre `dsn`. Elle génère des tables temporaires (`gwhxxxx1` macro var, `gwhxxxx2`, `gwhxxxx3`) et une table finale spécifiée par `newdsn`.

1 Bloc de code
PROC SQL
Explication :
Compte le nombre total d'enregistrements dans le jeu de données source pour déterminer le nombre de passes nécessaires. Arrête l'exécution si la table est vide.
Copié !
1PROC SQL noprint;
2 select count(*) into :gwhxxxx1
3 from &dsn;
4QUIT;
5 
6%IF &gwhxxxx1=0 %THEN %DO;
7 %put ====== WARNING: INPUT DATA SET &dsn is empty, macro ends =======;
8 %goto exit;
9%END;
2 Bloc de code
DATA STEP Data
Explication :
Boucle principale : calcule le nombre de passes, extrait un sous-ensemble de données (chunk) dans `gwhxxxx2`, et appelle les macros auxiliaires (non définies ici) `%MakeList` et `%RunQuery` pour traiter ce lot.
Copié !
1%let totpass=%sysevalf(&gwhxxxx1/&bitesize, ceil);
2%IF &test=no %THEN %DO j=1 %to &gwhxxxx1 %BY &bitesize;
3 %let p=%sysevalf(&j/&bitesize, ceil);
4 %put ================= Starting pass &p of &totpass ==================;
5
6 DATA gwhxxxx2;
7 SET &dsn (firstobs=&j obs=%eval(&j+&bitesize-1));
8 RUN;
9 
10 %MakeList(mylist, gwhxxxx2, &column, &vtype);
11 %RunQuery(&dbname, gwhxxxx3, &query);
12 
13 /* ... Logique d'accumulation ... */
14%END;
3 Bloc de code
DATA STEP / PROC APPEND Data
Explication :
Logique d'agrégation : initialise la table de sortie (`newdsn`) lors de la première itération, et ajoute les résultats (`gwhxxxx3` retourné par `%RunQuery`) lors des itérations suivantes via `PROC APPEND`.
Copié !
1%IF &j=1 %THEN %DO;
2 DATA &newdsn;
3 SET gwhxxxx3;
4 RUN;
5%END;
6%ELSE %DO;
7 PROC APPEND base=&newdsn DATA=gwhxxxx3;
8 RUN;
9%END;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
Informations de Copyright : Garth W. Helf, 2001 "Can't Relate? A Primer on Using SAS With Your Relational Database", SUGI 27 Paper 155-27