我正在尝试使用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不允许使用这种结构。任何反馈都非常感谢
答案 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这样的东西可以减少不那么令人不快。