Postgresql

使用帶有 postgresql 的preparedstatements 的語法錯誤

  • June 13, 2015

我有一個連接到 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 編號一樣。

引用自:https://dba.stackexchange.com/questions/103980