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