Макрос цикла SAS, пока счетчик obs> 0 - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь автоматизировать запланированное событие в SAS, чтобы при открытии программы SAS сначала выполнялся сквозной запрос, который создает локальную таблицу.Я хочу, чтобы этот запрос продолжал выполняться в цикле, пока счетчик наблюдений этой таблицы не станет> 0.Идея состоит в том, что мне нужно дождаться подтверждения от источника данных о том, что таблица готова, прежде чем я смогу запустить дополнительный код на сервере, что я бы сделал после макроса.Я также хотел бы, чтобы он спал в течение 10 минут каждый раз, когда в таблице отсутствуют наблюдения.

Мое соединение ODBC ...

proc sql;
connect to odbc(datasrc="SSDM"); 

EXECUTE ( Create Volatile Table DataReady as

(   
    SQL...

)   WITH DATA ON COMMIT PRESERVE ROWS;) by ODBC;

CREATE TABLE DataReady AS SELECT * FROM CONNECTION TO ODBC ( SELECT * FROM DataReady );

DISCONNECT FROM odbc;

quit;

и также включает функцию сна ...

data _null_;
rc=SLEEP(600);
run;

1 Ответ

0 голосов
/ 17 ноября 2018

Разбейте его на ключевые составные части

  1. установите начальный номер счетчика наблюдений равным 0
  2. Выполните ваши запросы
  3. Проверьте количество наблюдений
  4. Если ноль, режим сна, затем возврат к # 2

4 требует макрокода (следовательно, обертка макроса LOOPER ниже), 2 и 3 - PROC / DATASTEP, и 1 может быть либо.

%MACRO LOOPER ;
  %LET OBS = 0 ; /* #1 */

  %DO %WHILE (&OBS = 0) ; /* run everything inside this %DO %WHILE loop  whilst 0 obs - #4 */

    /* put your existing SQL code here - #2 */

    proc sql ; select count(1) into :OBS from DataReady ; quit ; /* #3 */

    %IF &OBS = 0 %THEN %LET S = %SYSFUNC(sleep(10,60)) ; /* sleep for 10 minutes if 0 obs */
  %END ;
%MEND ;

%LOOPER ;
...