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

时间:2016-07-20 12:27:49

标签: macros sas user-defined-functions

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

整个过程正常,但我无法在datastep中获得响应值。

如果我单独运行宏,我可以在日志中写入API响应,所以我理解应该能够返回我的datastep。

有什么想法吗?

这是代码

%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 $255. @@;
        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;

Datastep

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

1 个答案:

答案 0 :(得分:1)

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

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

我希望这会有所帮助。