今回JavaでSQLのテーブル名を引数にしようとしたらはまったのでメモ
はまった内容
今回はまったのはこのようなコード
String DEL_SQL = "DELETE FROM ? WHERE LOCATION LIKE ?)"; String table_name = "TABLE_A" String country = "JP" delPs = conn.prepareStatement(DEL_SQL); delPs.setString(1, table_name); delPs.setString(2, country + "%"); int delCnt = delPs.executeUpdate(); conn.commit();
これを実行すると、以下のエラーが出ます。
org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"
$1なんてどこでも使ってないのに…
ここで実際にどのようなSQLが流れているか見てみます。
DELETE FROM 'TABLE_A' WHERE LOCATION LIKE 'JP%')
テーブル名にシングルクォートが入っているのが原因でした。
解決策
以下のようにコードを書き直すと解決します。
String DEL_SQL = "DELETE FROM $tablename WHERE LOCATION LIKE ?)";
String table_name = "TABLE_A"
String country = "JP"
DEL_SQL = DEL_SQL.replace("$tablename", table_name);
delPs = conn.prepareStatement(DEL_SQL);
delPs.setString(1, table_name);
delPs.setString(2, country + "%");
int delCnt = delPs.executeUpdate();
conn.commit();

