Tips

動的なSQL文の構築

日付2008/04/23
ID08-012
バージョン11
プラットフォームMac & Windows

4DからデータソースにSQLクエリを送信する際、SQL文を動的に生成したい場合があります。

例1:データの挿入
INSERT INTO table VALUES (動的な値);

例2:検索
SELECT * FROM table WHERE field = (動的な値) ...;

上記SQL文で動的な値は、ユーザ入力あるいは他のデータソースから取得した値などが使用されます。

どのような場合でも、動的なSQL文を生成する場合には、4D式の参照を使用しなければなりません。なぜならその動的な値には、元のSQL文を不正なものにする要素が含まれる可能性があるからです。

例えばテキスト変数myDataに値"ABC'DEF"が格納されているとします。ここでSQL文を以下の式で生成すると、不正なSQL文が作成されます。

statement:="INSERT INTO table VALUES ('"+myData+"');"

この結果statementの中身は以下のようになります。

INSERT INTO table VALUES ('ABC'DEF');

このSQL文は、文字列を示すシングルクォートが余計に挿入されるため、エラーとなります。

これを回避するためには4D式の参照を使用して、SQL文を構築します。例えば以下のようにします。

Begin SQL
INSERT INTO table VALUES (:myData);
End SQL

4D式の参照については「4D SQL リファレンス」の「4DでSQLを使用する」-「4D SQLエンジンにアクセスする」の節を参照してください。

なお、何らかの理由で4D式の参照を使用できない場合、動的な値に対するエスケープ処理が必要になります。