Tips

SQLのEXECUTE IMMEDIATEにローカル変数を使用してはいけない

日付2009/04/24
ID09-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