2018年1月25日木曜日

RUNとQUITの違い【対話型プロシジャ】





プロシジャには「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 件のコメント:

コメントを投稿