出现错误:无法清除或重新分配库 DATA1,因为它仍在 SAS 中使用
Posted
技术标签:
【中文标题】出现错误:无法清除或重新分配库 DATA1,因为它仍在 SAS 中使用【英文标题】:Getting ERROR :Unable to clear or re-assign the library DATA1 because it is still in use in SAS 【发布时间】:2015-09-11 05:36:33 【问题描述】:这是我正在运行的代码,但我不确定为什么会出现该错误。
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 语句中的错误。
【问题讨论】:
你的代码对我来说很好用。我怀疑您在该库的查看器中打开了一个数据集,或者您的 SAS 会话中的其他内容包含一个表。 该库是否有可能链接到自动调用宏库或类似库? 【参考方案1】:尝试在新的会话中运行它。还要确保如果您在查看器中将其打开,然后将其关闭。确保没有其他用户或进程正在使用它。
有时代码会在某些时候出错并阻止close()
语句运行。发生这种情况时,必须手动运行close()
。在开发时,有时只需清除您打开的任何文件句柄就很方便。
您可以使用如下宏来执行此操作:
%macro close_all_dsid;
%local i rc;
%do i=1 %to 1000;
%let rc=%sysfunc(close(&i));
%end;
%mend;
%close_all_dsid;
编辑:我还注意到您在代码中遗漏了“肉”。如果您在 open()
和 close()
语句之间调用其他一些宏,则可能会覆盖 dsid
的值,因为您没有将宏变量声明为本地变量。我建议您至少声明以下内容:
%local dsid rc;
另一种解释是,您可能在某些时候运行了多个 open()
语句,但每次都没有运行相应的 close()
。如果您不小心连续运行了 2 个 open()
语句,则在第一次出现时,dsid
的值将被赋值为 1。第二次将被赋值为 2。如果您随后运行 @987654332 @ '2' 将关闭,但 '1' 仍将打开。无论您运行了多少次open()
和close()
,除非您手动运行close(1)
,否则“1”永远不会关闭,这实际上是我上面的代码 sn-p 正在执行的操作。
【讨论】:
感谢罗伯特的解释。你是对的,代码在遇到 Close() 之前就出错了。【参考方案2】:我今天在尝试重新分配库时遇到了同样的错误。回顾我的日志,我看到了以下内容(在 proc 附加之后):
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.
运行 Robert 的宏 (close_all_dsid) 修复了它。操作系统是在存储过程服务器会话中运行 SAS 9.2 的 Windows 2008r2。追加成功。如果/当我弄清楚时会回来!
【讨论】:
【参考方案3】:您可以终止并重新启动会话,然后它会正常工作。
【讨论】:
以上是关于出现错误:无法清除或重新分配库 DATA1,因为它仍在 SAS 中使用的主要内容,如果未能解决你的问题,请参考以下文章
捆绑包 UITests 无法加载,因为它已损坏或缺少必要的资源。尝试重新安装捆绑包