理解不足 アドバイス欲しい 自分用メモ- ③DS2 sqlstmtパッケージでSQLを実行する

忘備録の記事
「DS2プロシジャのSQLEXEC関数でSQLを実行する。」
http://sas-boubi.blogspot.jp/2015/04/ds2sqlexecsql.html
にいまさらながら触発される

【忘備録のコード】

data DT1;
   A=1;
   output;
   output;
run;
*** DS2でSQLを実行する **********;
proc ds2 libs=work;
   data _NULL_;

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

このような
ステップ内でのSQLの可変的実行に関しては、SQLSTMTパッケージを使っても可能で
SQLEXECとの違いとして、UPDATEやINSERTに限定されずにSQL文を実行できたり、
パラメータを渡せる(文字列合成でSQL文作ってSQLEXECするのも、ある意味パラメーターみたいなもんだけど)
ということを見たのでSQLSTMTパッケージで、どう書くのかしらと挑戦してみた。

で、できたのが以下です。一応動くし、結果は同じになります。
ただこれが正解の書き方なのかが自信がない。てか多分違う。

proc ds2 libs=work;
 data _null_;
  dcl double rc A2;
  dcl package sqlstmt s('update DT1 set A=?',[A2]);
method run();
A2=2;
rc=s.execute();
if rc^=0 then put '更新失敗しました';
end;
  enddata;
run;
quit;

しかしよくわからないのが、パラメータの渡し方。DT1の部分をパラメーター指定にするのがわからない?
できるのか?
パッケージ自体のパラメータに設定して、executeメソッド内で渡すように書くのかと思ったらそうでもない?
BINDPARAMETERメソッドとか使うのかと思ったらそういうわけでもない?

そもそもパッケージの仕組みの理解がやっぱよくわかってないんだね。

厚かましい話なんですが、SQLSTMTパッケージで何かコード書いてる人がいたら、参考にどっかにあげてくれると
勉強になってありがたいなぁって思いました。
DS2は海外でもまだそこまでコードがあがってないから苦労します。SAS Technical NewsでDS2特集とかやって欲しい

2 件のコメント:

  1. こんばんは。
    私もDS2勉強中ですが、SQLSTMTの書き方バッチシだと思います。
    あとDT1の部分はパラメータに指定出来ないっぽいです多分(変数部分しか渡せないっぽい)

    返信削除
  2. 有難うございます!間違ってなかったですか、よかった。
    忘備録のDS2の記事に救われてます。あれ読んでないで、一人で勉強始めてたら多分挫折してました。

    返信削除