2015-06-24 1 views
2

Вот код, который я запускаю, и я не уверен, почему я получаю эту ОШИБКУ.Получение ERROR: невозможно очистить или повторно назначить библиотеку DATA1, поскольку она все еще используется в SAS

options symbolgen mlogic; 
libname lib11 '/home/userid'; 

%macro SFTPLoop(ds); 
    %global numobs; 
    %let dsid = %sysfunc(open(&ds)); 
    %if &dsid %then %do; 
     %let NumObs= %sysfunc(AttrN(&dsid,NObs)); 
     %If &NumObs>0 %THEN %DO; 
     %do %while (%sysfunc(fetch(&dsid)) = 0); 

     %end; 
     %end; 
     %else %put ERROR:Data set &dset has 0 rows in it.; 
     %let rc = %sysfunc(close(&dsid)); 
    %end; 
    %else %put ERROR:open for data set &dset failed - %sysfunc(sysmsg()).; 
%mend SFTPLoop; 
%SFTPLoop(lib1.data); 

16 libname lib1 '/ home/userid';

ОШИБКА: Невозможно очистить или переустановить библиотеку LIB1, поскольку она все еще используется. ОШИБКА: Ошибка в заявлении LIBNAME.

+0

Ваш код отлично работает для меня. Я подозреваю, что у вас есть набор данных, открытый в программе просмотра из этой библиотеки, или что-то еще в вашем сеансе SAS содержит в себе таблицу. – DomPazz

+0

Эта библиотека случайно связана с библиотекой макросов автозаполнения или аналогичной? – Joe

ответ

3

Попробуйте запустить его в новой сессии. Также убедитесь, что если вы открыли его в окне просмотра, он закрыт. Убедитесь, что другие пользователи или процессы не используют его.

Иногда код может быть ошибкой в ​​какой-то момент и предотвратить выполнение оператором close(). Когда это произойдет, необходимо вручную запустить close(). При разработке иногда удобно просто очистить все дескрипторы файлов, которые вы открыли.

Вы можете использовать макрос, как показано ниже, чтобы сделать это:

%macro close_all_dsid; 
    %local i rc; 
    %do i=1 %to 1000; 
    %let rc=%sysfunc(close(&i)); 
    %end; 
%mend; 
%close_all_dsid; 

EDIT: Я также заметил, что вы оставили «мясо» из вашего кода. Если вы вызываете некоторые другие макросы между операторами open() и close(), возможно, вы переписываете свое значение dsid, так как вы не объявляете свои макропеременные локальными. Я хотел бы предложить вам по крайней мере заявить следующее, как минимум:

%local dsid rc; 

Другое объяснение состоит в том, что это возможно, что в какой-то момент вы запустили несколько open() заявления без запуска соответствующего close() каждый раз. Если вы случайно выполнили 2 open() операторов в строке, то в первом вхождении значение dsid было бы присвоено значение 1. Второе время ему будет присвоено значение 2. Если вы затем запустите close(), то «2» будет быть закрытым, но «1» все равно будет открытым. Независимо от того, сколько раз вы запустили open() и close(), «1» никогда не будет закрыт, если вы вручную не запустили close(1), что эффективно, что делает мой фрагмент кода выше.

+0

Спасибо за ваше объяснение robert. U были правы, код был ошибочен, прежде чем он столкнулся с Close(). –

0

У меня такая же ошибка сегодня при попытке переназначить библиотеку. Оглядываясь назад через мой журнал, я увидел следующее (после прока Append):

NOTE: BASE file MYLIB.MYDS.DATA set to record level control because there is at 
least one other open of this file. The append process may take longer to complete. 

Запуск макроса Роберта (close_all_dsid) установил ее. ОС - Windows 2008r2, работающая под управлением SAS 9.2 на сеансе сервера хранимого процесса. Приложение было успешным. Вернусь, если/когда я это выясню!

 Смежные вопросы

  • Нет связанных вопросов^_^