SQLのEXECUTE IMMEDIATEにローカル変数を使用してはいけない
| 日付 | 2009/04/24 |
|---|---|
| ID | 09-045 |
| バージョン | 11 |
| プラットフォーム | Win & Mac |
ダイナミックなSQLコードを作成する便利な手段として、SQLステートメントをテキスト変数に代入し、その変数をSQLコマンドEXECUTE IMMEDIATEを渡す方法が挙げられます。
C_TEXT($SQL_T)
C_LONGINT($TmpCount_L)
$SQL_T:="SELECT COUNT(*)"
$SQL_T:=$SQL_T+" FROM "+Table name(EventTable_ptr)
$SQL_T:=$SQL_T+" WHERE "+Field name(UserIDFld_ptr)+" = '"+UserIDs_aT{$Ndx}+"'"
$SQL_T:=$SQL_T+" INTO :$TmpCount_L;"
Begin SQL
EXECUTE IMMEDIATE :$SQL_T;
End SQL
上記コードはデータベースがインタプリタモードで実行されている限り、問題なく動きます。しかしコンパイルモードでは、$TmpCount_Lが未定義であるというSQLエラーが返されます。
このコードがコンパイルモードでも実行できるようにするためには、$TmpCount_Lをプロセス変数にすることが必要です。これはバグではなく、4Dの設計により予期される動作であり、デベロッパはこのことに留意する必要があります。
C_TEXT($SQL_T)
C_LONGINT(TmpCount_L)
$SQL_T:="SELECT COUNT(*)"
$SQL_T:=$SQL_T+" FROM "+Table name(EventTable_ptr)
$SQL_T:=$SQL_T+" WHERE "+Field name(UserIDFld_ptr)+" = '"+UserIDs_aT{$Ndx}+"'"
$SQL_T:=$SQL_T+" INTO :TmpCount_L;"
Begin SQL
EXECUTE IMMEDIATE :$SQL_T;
End SQL