プロシジャには「RUN」で終わらせるものと、「QUIT」で終わらせるものがあります。
RUNで終わる例
proc print data=SASHELP.CLASS;
run;
proc means data=SASHELP.CLASS;
var HEIGHT;
run;
|
QUITで終わる例
proc datasets nolist;
copy in=SASHELP out=WORK;
select CLASS;
run;
quit;
proc sql;
select *
from SASHELP.CLASS;
quit;
|
「RUN」と「QUIT」どちらで終わるのかは、プロシジャが対話型かどうかで決まります。
対話型について、以下SAS社FAQを見ると分かり易いと思います。
「対話型プロシジャの終了方法」
https://www.sas.com/offices/asiapacific/japan/service/technical/faq/list/body/ba022.html
つまり、
通常は「RUN」でプロシジャを終了させることが出来ますが、対話型プロシジャの場合は「RUN」で実行されるものの、プロシジャは終了しません。
「QUIT」と書くか、別のDATAステップ・PROCステップが現れるまで、プロシジャは起動したままになります。
・DATASETSプロシジャの場合
以下を実行したとします。
proc datasets nolist;
copy in=SASHELP out=WORK;
select CLASS;
run;
|
確かに「RUN」のタイミングで実行はされるんですが、「QUIT」がないのでプロシジャは開いたままです。なので以下のように続けて書くことが出来ます。
copy in=SASHELP out=WORK;
select BASEBALL;
run;
quit;
|
・SQLプロシジャの場合
proc sql;
select * from SASHELP.CLASS;
|
「QUIT」でプロシジャを終了させていないので、以下のように続けて書くことが出来ます。
select * from SASHELP.CLASS where AGE = 13;
quit;
|
(※SQLプロシジャの場合は「RUN」ではなく「;」で実行されるので、他の対話型プロシジャとはちょっと異なる)
SQLプロシジャの対話型機能をつかった書き方については、以前ちょっと紹介してます。
複数のSQL文は、ひとつのPROC SQLにまとめて書くことが出来る
私の場合、
「RUN」の実行後に以下のようなLogメッセージが出ない場合は、プロシジャの処理が完了していないという事になるので、「対話型」として考えてます。
NOTE: PROCEDURE ●●処理(合計処理時間):
処理時間 X.XX 秒
CPU時間 X.XX 秒
環境や設定によって挙動が異なります。
例えば、SAS Ondemand for Academicsについては、私の環境下では対話型モードがONになっていないので、
以下のプログラムを実行すると、、まずは、ちゃんと実行されます。
proc sql; select * from SASHELP.CLASS; |
次に以下を実行すると、対話型モードになっていないため、ERRORになります。
select * from SASHELP.CLASS where AGE = 13; quit; ログ ERROR 180-322: ステートメントが有効でないか、適切な順序で使用されていません。 |
ただ、上の青文字と赤文字のプログラムをいっぺんに実行した場合、構文としてはおかしくないので、ちゃんと実行はできます。
(ちなみに、SAS Ondemand for Academicsの場合、対話型モードをONにすると、他の機能の挙動が変わってしまって面倒なので、あまりデフォルトの設定をいじらない方がよいかも。。)
0 件のコメント:
コメントを投稿