无法从 SAS 中的用户定义函数中获取 return 值

Cant get return value from user defined functions in SAS

我有一个调用 SAS 宏的函数,该宏负责调用 API 并获得您的答案。这个函数是从一个步骤数据调用的,传递一个参数。

整个过程正常,只是我无法在datastep中获取响应值。

如果我单独 运行 宏,我可以将 API 响应写入日志,所以我理解应该能够 return 我的数据步骤。

有什么想法吗?

这是代码

%macro acortador();
%put &url_larga;

data _null_;
 length url $ 2048;
 url = catt(
 'http:XXXXXX',urlencode(trimn(&url_larga)));  
 call symputx('REQUEST_URL', url);
 run;

 %put &REQUEST_URL;

/* API request */
filename out "XXXXXXXX.xml";

proc http 
    out=out         
    url= "%superq(REQUEST_URL)"
    method="get";
run;

/* response xml */
filename data 'XXXXXXX.xml';

data _null_;
    infile data lrecl = 32000 truncover scanover;
        input                       
            @"<status>" shorturl 5. @@;
        shorturl = substr(shorturl,1,index(shorturl,'</')-1);   
        call symputx('r', shorturl);
run;

 %put &r;

%mend acortador;

函数

proc fcmp outlib=work.funcs.test;
function acortador(url_larga $) $ 300;
 rc = run_macro('acortador', url_larga, r);
  return (r);
endsub;
quit;

options cmplib=work.funcs;

数据步

data test;  
    set work.origin_table;
    r = acortador(some_parameter);  
run;

问题出在 RUN_MACRO 中使用的 return 变量 r。您没有为其分配长度,默认情况下 SAS 假设它是一个数字,因此您可能会得到一个 . (缺少数字)。如果你尝试让你的宏定义生成让说 %let r=1;那么您将在当前代码中获得 return 值 1。但是由于我们正在寻找获取修改后的响应字符串。所以要获得字符值,只需在 r 第一次使用之前添加 r 的长度。

length r $ 32767;
rc = run_macro('acortador', url_larga, r);

希望对您有所帮助。