2015年4月24日金曜日

DS2プロシジャのSQLEXEC関数でSQLを実行する。


SAS9.4で追加されたDS2プロシジャを勉強中です。

データステップがパワーアップした感じのやつなんですが、勝手が違うので、なかなかすんなりと動いてくれないです。。(そこがまた楽しいですが)

今回は、DS2プロシジャらしいダイナミックな関数、SQLEXEC関数を使ってみたいと思います(注意点もあるので最後までご覧ください)



*** サンプルデータ作成 *************;
data DT1;
   A=1;
   output;
   output;
run;

 A 
  1 
  1  

*** DS2でSQL (FedSQLステートメント) を実行する ***;
proc ds2;
   data _NULL_;

      method run();
          dcl double rc;
          rc = sqlexec( 'update DT1 set A=2' );
          if rc^=0 then put '更新失敗しました';  
      end;
       
   enddata;
   run;
quit;

 A 
  2  
  2 


構文
  SQLEXEC( 'FedSQLステートメント' )



ポイントと注意点
  • SQLEXEC関数に記載するSQL文は「PROC SQL」ではなく「FedSQLステートメント」である点に注意(FedSQLの詳細についてはSAS社のリファレンスを参照下さい)
  • FedSQLステートメントはシングルクオーテーションで囲む
  • UPDATEやINSERTなど更新・追加・削除・作成をするFedSQLを指定します(SQLEXEC関数自体はFedSQLを実行するだけで、実行結果のテーブルを取得できるわけではないので、単純なSELECT文を指定しても意味ない)
  • 色々試してみた感じでは実行が成功すればリターンコードとして「0」が返される?(SAS社のリファレンスにこの辺の挙動の記載が見つけられなかったので、プログラムに組み込む場合は要確認)


今回の例では、データセットDT1の変数Aの値を更新するSQLを実行しています。

  rc = sqlexec( 'update DT1 set A=2' );

DS2プロシジャの中で、FedSQLの文を文字列として生成できるところがポイントですね。



自分自身の備忘録も兼ねて、いつかDS2プロシジャ入門の記事を書きたいなと思ってます。
需要ないだろって感じですが。


0 件のコメント:

コメントを投稿