■質問日: |
2005/12/15 |
■最終更新日: |
2012/03/14 |
■質問内容: |
SQLの設定で、 "SELECT * FROM EMP WHERE DEPTNO IN ( :DEPTNO )" のような記述を行い、検索用ParamSetに setString("DEPTNO", "1001,2003,3005"); のように定義してSQLを実行すると、例外が発生します。 複数のパラメータはどのように設定するのでしょうか? |
■回答内容: |
対象バージョン:ver2.0-006以降 WebReporCafeでは、セミコロンを指定したパラメタの他に、文字列を埋め込める 特殊なパラメタがあります。 SQL中に"/*$ XXX $*/"という文字列を埋め込むとType.STRING型のパラメタが生 成され、パラメタXXXに設定した値がSQL実行時に埋め込まれます。 この形式のパラメタを利用すると、IN を使った選択条件も簡単に実現すること ができます。 ※WebReporCafe Designer上で実行することも可能です。 例: rowset.setSQL("SELECT * FROM EMP /*$ WHERE_CLAUSE $*/"); //--- (*) rowset.getParamSet().setString("WHERE_CLAUSE", "AND DEPTNO IN ('1001', '2003', '3005')"); ↓ SQL中の"/$* WHERE_CLAUSE $*/"の部分が"AND DEPTNO IN ('1001', '2003', '3005')"に 置き換えられて実行されます。すなわち SELECT * FROM EMP WHERE DEPTNO IN ('1001', '2003', '3005') のSQLが実行されることになります。 ※注 "/*$ XXX $*/"形式のパラメタはSQL injectionのセキュリティホールになる 危険性もありますので、使用には十分気をつけてください。 例: "UPDATE TBL_USER SET PASSWORD = :PASSWORD WHERE USERID = :USERID /*$ WHERE_CLAUSE $*/" のSQLで、"WHERE_CLAUSE"のパラメタに" OR 1 = 1" のような文字列を設定 すると全員のパスワードが書き換えられることになります。 /*$ XXX $*/ に当たる部分は、ユーザが直接入力した文字を設定しないな どの対策を行ってください。 |
■添付資料: |
なし |