Postgresql
使用帶有 postgresql 的preparedstatements 的語法錯誤
我有一個連接到 PostgreSQL 數據庫的 Java 應用程序。
使用簡單的程式碼,例如:
ps = con.prepareStatement(sql); if (dataTypes != null && dataTypes.size() > 0) { for (int i = 0; i < dataTypes.size(); ++i) { if (dataTypes.get(i) == DataTypes.NUMERIC) ps.setLong((i + 1), Long.parseLong(values.get(i))); else ps.setString((i + 1), values.get(i)); } } rs = ps.executeQuery();
並帶有類似的查詢
select ? from dummy
它工作正常。在 postgres 日誌中顯示的是:
2015-06-13 12:48:30 EEST [28294-3] xx LOG: execute <unnamed>: select $1 from dummy 2015-06-13 12:48:30 EEST [28294-4] xx DETAIL: parameters: $1 = '0'
但是使用如下查詢:
select to_char(now()+interval ? day, 'YYYYMMDD') from dummy
我收到語法錯誤:
Cause [org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"
在 postgres 日誌中:
2015-06-13 13:17:39 EEST [29311-3] xxx ERROR: syntax error at or near "$1" at character 31 2015-06-13 13:17:39 EEST [29311-4] xxx STATEMENT: select to_char(now()+interval $1 day, 'YYYYMMDD') from dummy
但在 pgadmin 中類似
select to_char(now()+interval '0' day, 'YYYYMMDD') from dummy
工作得很好,沒有任何錯誤。
我只是無法弄清楚問題是什麼。為什麼其中一個查詢有效,而另一個查詢無效?
我的 PostgreSQL 版本是 9.4
常見的解決方案是將其表示為:
interval '1 day' * ?
with
?
作為數值的佔位符(可能帶有小數部分)。問題中嘗試的語法被拒絕,因為對於 SQL 語法,整個表達式
interval '1 day'
是一個常量。無法通過向其中註入佔位符來更改它,就像我們無法寫入3.?
並.1415926
作為外部參數傳遞來形成 PI 編號一樣。