clojure.java.jdbc更新其中的id

时间:2016-04-28 20:27:31

标签: oracle jdbc clojure sql-update

我正在尝试使用clojure.java.jdbc在Oracle DB上执行简单的更新语句。

(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不允许使用这种结构。任何反馈都非常感谢

3 个答案:

答案 0 :(得分:2)

您需要in (?, ?) ...这就是您需要与要查找的内容相同数量的问号.... (str/join ", " (repeat n "?")) 并且你需要params不是矢量:

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

请注意,您可以将sql和参数放在一个向量

答案 1 :(得分:1)

由于某些原因,使用大多数数据库的预准备语句很难做到这一点:存在安全隐患,不同数据库的语法在这一点上有所不同。

我不完全确定clojure jdbc包是否可行。 对于Oracle,您可以尝试回退到oracle java jdbc包,创建一个ARRAY类型实例并将其作为单个参数传递。 Official doc

就像@Timothy Pratley所写的那样,最常见的解决方案是添加占位符作为你拥有的元素。 其他一些替代方案已经讨论过here

答案 2 :(得分:1)

在想要运行add_action( 'save_post', 'save_tiles_meta' ); function save_tiles_meta(){ global $post; update_post_meta( $post->ID, 'tiles', $_POST['tiles'] ); // On or Off } 条件中具有in子句的SQL的一般情况下,您需要这样的内容:

where

字符串连接有时很难看。正如在Curtis Summers的评论中提到的Timothy Pratley's answer,使用像HoneySQL这样的东西可以减少不那么令人不快。