2016-04-28 27 views
1

我想用clojure.java.jdbc在Oracle數據庫上做一個簡單的更新語句。clojure.java.jdbc更新其中id在

(sql/db-do-prepared db "update table_name set active = 1 where id in (?)" ["one" "two"]) 

,但我得到:

java.sql.SQLException: Invalid column index 

我相信,所有的數據類型是正確的。它看起來像clojure.java.jdbc不允許那種構造。任何反饋的高度讚賞

回答

2

由於種種原因,這是很困難這與大多數數據庫一份準備好的聲明:有安全隱患和語法的不同數據庫在這一點上有所不同。

我不完全確定這是否可行與clojure jdbc包。 對於Oracle,您可以嘗試回退到oracle java jdbc包,創建一個ARRAY類型實例並將其作爲單個參數傳遞。 Official doc

就像@Timothy Pratley寫道,最常見的解決方案是添加儘可能多的佔位符作爲您擁有的元素。 已經討論了一些其他的替代方案here

1

你需要in (?, ?) ...這是你需要相同數量的問號作爲的事情,尋找.... (str/join ", " (repeat n "?")) 和你需要的PARAMS不爲向量:

(sql/execute! db 
    ["update table_name set active = 1 where id in (?, ?)" 
    "one" "two"]) 

注意,你可以把SQL和參數一起在一個向量

+0

我試過在提問之前:)我得到:'ava.sql.SQLException:要執行的SQL語句不能爲空或空' – r00tt

+0

這是正確的答案。您可能會再次發佈您的代碼來處理您所看到的特定異常。另外,有很多庫可以幫助你解決這類問題:[HugSQL](http://www.hugsql.org),[Honey SQL](https://github.com/jkk/honeysql) –