次の例について検討します。この例では、マクロ内に、CALL SYMPUTステートメントを含む完全なDATAステップが含まれています。
%macro env1(param1);
data _null_;
x = 'a token';
call symput('myvar1',x);
run;
%mend env1;
%env1(10)
data temp;
y = "&myvar1";
run;
これらのステートメントをサブミットすると、次のエラーメッセージが表示されます。
WARNING: Apparent symbolic reference MYVAR1 not resolved.
このメッセージが表示されるのは、次にあげる理由からです。
-
DATAステップがENV1の環境内で完了している(つまり、RUNステートメントがマクロに含まれている)
-
ローカルシンボルテーブルが空でない(パラメータPARAM1が含まれる)
したがって、CALL SYMPUTルーチンによってENV1のローカル変数としてMYVAR1が作成されます。この変数は、グローバルマクロ変数を期待するその後のDATAステップでは使用できません。
スコープを表示するには、_USER_オプション付きの%PUTステートメントをマクロに追加し、同様のステートメントをオープンコードにも追加します。ここで、前と同様に次のマクロを呼び出します。
%macro env1(param1);
data _null_;
x = 'a token';
call symput('myvar1',x);
run;
%put ** Inside the macro: **;
%put _user_;
%mend env1;
%env1(10)
%put ** In open code: **;
%put _user_;
data temp;
y = "&myvar1"; /* ERROR - MYVAR1 is not available in open code. */
run;
これらの%PUT _USER_ステートメントを実行すると、次の情報がSASログに書き込まれます。
**Inside the macro:** ENV1 MYVAR1 a token ENV1 PARAM1 10 ** In open code:**
CALL SYMPUTによって、ENV1のローカルシンボルテーブルに、マクロ変数MYVAR1が作成されます。グローバルマクロ変数が作成されないため、オープンコード内の%PUT
_USER_ステートメントは、SASログに何も書き込みません。
次の図に、この例のすべてのシンボルテーブルを示します。