2016-04-28 3 views
1

Я пытаюсь сделать простой оператор обновления в Oracle DB с помощью clojure.java.jdbc.clojure.java.jdbc update где 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 вы можете попытаться вернуться к пакету java java java, чтобы создать экземпляр типа 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 заявление выполнить не может быть пустым или null' – r00tt

+0

Это правильный ответ. Вы можете отправить свой код еще раз, чтобы иметь дело с тем исключением, которое вы видите. Кроме того, существует множество библиотек, которые помогут вам в этом вопросе: [HugSQL] (http://www.hugsql.org), [Honey SQL] (https://github.com/jkk/honeysql) –

Смежные вопросы