2013-12-08 48 views
2

我看到下面的Clojure.java.jdbcClojure的DB-DO準備與多個參數調用

(sql/db-do-prepared db "INSERT INTO fruit2 (name, appearance, cost, grade) VALUES (?, ?, ?, ?)" ["test" "test" 1 1.0]) 

例如但是如何轉換以下java代碼爲clojure。我是新來clojure和不知道如何傳遞多個vector

final int numRows = 10000; 
    PreparedStatement pstmt = conn 
     .prepareStatement("insert into new_order values (?, ?, ?)"); 
    for (int id = 1; id <= numRows; id++) { 
     pstmt.setInt(1, id % 98); 
     pstmt.setInt(2, id % 98); 
     pstmt.setInt(3, id); 
     int count; 
     if ((count = pstmt.executeUpdate()) != 1) { 
     System.err.println("unexpected update count for a single insert " + count); 
     System.exit(2); 
     } 
     if ((id % 500) == 0) { 
     System.out.println("Completed " + id + " inserts ..."); 
     } 
    } 
+0

對不起也許API改變,但我不會按照你的問題。你能否詳細說明一下? – Chiron

回答

5

多個載體,功能可變參數:

(sql/db-do-prepared db "INSERT INTO fruit2 (name, appearance, cost, grade) VALUES (?, ?, ?, ?)" ["test" "test" 1 1.0] ["test" "test" 2 3.0]) 

如果要生成一個列表中的輸入,可以使用適用於:

(apply sql/db-do-prepared db "INSERT INTO fruit2 (name, appearance, cost, grade) VALUES (?, ?, ?, ?)" (for [i (range 10)] ["test" "test" i 1.0])) 

對於邏輯的文字再現,你不能使用可變參數,因爲它不會給你一個機會來檢查每一個返回值下一步操作之前:

(let [num-rows 1000 
     success 
     (reduce 
     (fn [state id] 
     (let [values [(mod id 98) 
         (mod id 98) 
         id] 
       [result] (sql/do-prepared "insert into test values (?)" values)] 
      (if (not= result 1) 
      {:ok id} 
      (reduced {:error result})))) 
     (range 1 (inc num-rows)))] 
    (if-let [id (:ok success)] 
    (println "Completed" id "inserts") 
    (do (println "unexpected update count for a single insert" (:error success)) 
     (System/exit 2)))) 
0

就我而言,我認爲@noisesmith是正確的,除了我覺得sql-params應在集合(矢量)。

(SQL/DB-DO-製備 分貝 [ 「INSERT INTO fruit2(姓名,外觀,成本,等級)VALUES(?,?,?,?)」 「測試」, 「測試」 1 1.0] )

我覺得這對我的作品(我失去的東西,請讓我知道)

還是自2013年起