今回JavaでSQLのテーブル名を引数にしようとしたらはまったのでメモ
はまった内容
今回はまったのはこのようなコード
1 2 3 4 5 6 7 8 9 |
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(); |
これを実行すると、以下のエラーが出ます。
1 |
org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1" |
$1なんてどこでも使ってないのに…
ここで実際にどのようなSQLが流れているか見てみます。
1 |
DELETE FROM 'TABLE_A' WHERE LOCATION LIKE 'JP%') |
テーブル名にシングルクォートが入っているのが原因でした。
解決策
以下のようにコードを書き直すと解決します。
1 2 3 4 5 6 7 8 9 10 |
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(); |