前のページ|次のページ

DOSUBL関数

呼び出し環境からマクロ変数をインポートし、マクロ変数をエクスポートして元の呼び出し環境へ戻します。

カテゴリ: マクロ

構文

DOSUBL(x)

必須引数

x

テキスト文字列を指定します。

詳細

DOSUBL関数では、テキスト文字列が渡された後でSASコードを即時実行できます。サブミットされたコードの実行時に作成または更新されたマクロ変数は、エクスポートされて元の呼び出し環境に戻されます。
DOSUBLでは、SASコードが実行可能だった場合はゼロの値が返され、SASコードが実行不可能だった場合はゼロ以外の値が返されます。

比較

マクロを使用してグローバルマクロ変数を設定した後、DOSUBL関数でそのマクロを呼び出すと、マクロは即時実行されます。しかしながら、DATAステップを使用してマクロ変数の値を設定した後、CALL EXECUTEルーチンを使用してそのマクロを呼び出す場合は、現在のDATAステップの完了後にDATAステップコードが実行されます。

例: DOSUBLとCALL EXECUTEルーチンの比較

   /* The %TRYIT macro is created. %TRYIT sets the global macro */
   /* variable MYMAC from the macro code.                       */ 
%macro tryit(x);
%global mymac;
%if &x=1 %then %let mymac=2;
%else %let mymac=3;
%mend;

   /* MYMAC is defined as a global variable, and its value is set to 4. */
%global mymac;
%let mymac=4;

   /* The %TRYIT macro is invoked by the CALL EXECUTE routine. The macro code */
   /* is executed immediately, and MYMAC has a value of 2. The value of the   */
   /* MYMAC variable is retrieved by using the SYMGET function.               */ 

data _null_;
   call execute('%tryit(1)');
   value=symget('mymac');
   put value= '(should be 2)';
run;

   /* The value of MYMAC is set to 4. */
%let mymac=4;

   /* This DATA step uses the DOSUBL function to achieve the same result. */
data _null_;
   rc=dosubl('%tryit(1)');
   value=symget('mymac');
   put value= '(should be 2)';
run;

   /* The definition of %TRYIT is changed so that a DATA step is */
   /* invoked to set the value of MYMAC.                         */
%macro tryit(x);
%global mymac;
data _null_;
   if &x=1 then mymac=2;
   else mymac=3;
   call symputx('mymac', mymac);
run;
%mend;

   /* The value of MYMAC is set to 4 by the %LET macro. CALL EXECUTE     */
   /* calls the %TRYIT macro to be invoked immediately, but the macro    */
   /* contains a DATA step. The DATA step code executes after the        */
   /* current DATA step completes. Therefore, the value of MYMAC remains */ 
   /* 4. The call to the SYMGET function does not retrieve the proper    */
   /* value of MYMAC, which is 2.                                        */
%let mymac=4;
data _null_;
   call execute('%tryit(1)');
   value=symget('mymac');
   put value= '(should be 2)';
run;

   /* If you use the DOSUBL function, the code in the %TRYIT macro is     */
   /* executed immediately, and the SYMGET function returns a value of 2. */
%let mymac=4;
data _null_;
   rc=dosubl('%tryit(1)');
   value=symget('mymac');
   put value= '(should be 2)';
run;

関連項目:

CALLルーチン:
前のページ|次のページ|ページの先頭へ