忘備録の記事
「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特集とかやって欲しい
こんばんは。
返信削除私もDS2勉強中ですが、SQLSTMTの書き方バッチシだと思います。
あとDT1の部分はパラメータに指定出来ないっぽいです多分(変数部分しか渡せないっぽい)
有難うございます!間違ってなかったですか、よかった。
返信削除忘備録のDS2の記事に救われてます。あれ読んでないで、一人で勉強始めてたら多分挫折してました。