2008-11-19 45 views
1

是否有一種方法可以使用PreparedStatement執行查詢(包含內置的DB函數)?JDBC內置函數和預處理語句

示例: 插入foo(位置)值(pointfromtext('12.56666 13.67777',4130)) 這裏,pointfromtext是一個內置函數。

回答

2

通過我所看到的,pointfromtext函數的第一個參數是一個字符串,第二個參數是一個數字。因此,請嘗試以下操作:

PreparedStatement preparedStatement = getConnection().prepareStatement("insert into map_address (location) values(pointfromtext('POINT(' || ? || ' ' || ? || ')',4130))"); 
preparedStatement.setString(1, "12.56565665"); 
preparedStatement.setString(2, "12.57565757"); 
preparedStatement.executeUpdate(); 
+0

字符串串聯是唯一的出路嗎?我有沒有辦法告訴JDBC逃脫引號並讓它知道?是要用一個參數代替? – Abhi 2008-11-20 04:43:24

2

當然,這應該工作。

如果不是,您的數據庫系統是什麼,並且可以從SQL命令行運行完全相同的命令嗎?

0

PreparedStatement對象的作用域恰好是執行查詢。如果查詢包含內置的數據庫函數,那麼如果相同的查詢在PreparedStatement之外工作,則一切都應該正常工作。

正如Thilo所說,測試您的查詢表單SQL命令行或使用您通常使用的SQL圖形工具。

0

你把connection.commit()在這段代碼之後?

的代碼應該是:

PreparedStatement bar = connection.prepareStatement("insert into foo (location) values (pointfromtext('? ?',4130)))"); 
bar.setDouble(1, 13.67777); 
bar.setDouble(2, 13.67777); 
bar.executeUpdate(); 
connection.commit(); 
0

你有沒有試着不要在preparaedStatement盤雙打?只是用於測試,你應該嘗試直接在字符串插入此參數,像:

String sql = "insert into map_address (location) values(pointfromtext('POINT(" + "12.56565665" + " " + "12.57565757" + ")',4130))" 

PreparedStatement preparedStatement = getConnection().prepareStatement(sql); 

,然後嘗試執行更新。

1

問號未被正確評估,因爲它們介於簡單的引號之間。刪除它們,它應該工作,

0

也許你已經發現Postgresql JDBC驅動程序的問題,而不是本身與JDBC。一般來說,你想實現與JDBC一起工作。