在proc fcmp中使用proc sql命令?

时间:2015-10-12 20:51:35

标签: sql sas user-defined-functions

我是SAS新手并尝试创建一个涉及proc sql的用户定义函数,该函数的简化版本如下;

proc fcmp outlib=work.funcs.test;
function calculate(table1, var1, motherTable);
proc sql noprint;
     create table table1 as
     select var1 
     from motherTable;
quit;
return();
endsub;

然而,当我运行程序时,我得到以下内容:

ERROR: Subroutine 'calculate' was not terminated with ENDSUB.
ERROR: File WORK.MOTHERTABLE.DATA does not exist.

我用endsub()终止了这个函数,我知道motherTable不存在,因为它是一个尚未定义的函数的参数。有谁知道是什么问题?非常感谢你!

2 个答案:

答案 0 :(得分:3)

首先,你在做什么可能在宏中做得更好。这就是你在SAS中大部分时间都这样做的事情。

%macro calc_func(in_table=, out_table=, var=);

  proc sql noprint;
    create table &out_table. as
      select &var. 
      from &in_table.
    ;
  quit;
%mend calc_func;

其次,你可以在用户定义的函数中执行此操作(或者用户定义的调用例程,更可能的是,因为这里没有返回任何内容);但如果我的理解是正确的话,你必须通过宏来完成它。

查看this paper了解详情,或参阅以下示例。

%macro calc_func();
  %let table1=%sysfunc(dequote(&table1.));
  %let var1=%sysfunc(dequote(&var1.));
  %let motherTable=%sysfunc(dequote(&motherTable.));

  %put _all_;

  proc sql;
    create table &table1. as (
      select &var1. 
      from sashelp.&motherTable.)
    ;
  quit;
%mend calc_func;

proc fcmp outlib=work.funcs.test;
  function calculate(table1 $, var1 $, motherTable $);
    rc = run_macro('calc_func', motherTable, table1, var1 ); 
    return(rc);
  endsub;
quit;

options cmplib=work.funcs;
data _null_;
  x = calculate('newclass', 'age', 'class');
  put x=;
run;

基本上,RUN_MACRO将宏名称作为参数,然后允许FCMP使用FCMP变量(或传递的参数)的名称创建宏变量。但是,你必须删除他们的报价,这是......恼人的。我认为,除非确实有必要,否则不要这样做的理由很充分。

答案 1 :(得分:0)

The PROC SQL statement is ending the PROC FCMP compilation. You should just write that as a macro.

%macro calculate(table1, var1, motherTable);
proc sql noprint;
  create table &table1 as
    select &var1 
    from &motherTable
  ;
quit;
%mend calculate;