2016-04-28 7 views
1

Ich versuche, eine einfache Update-Anweisung auf Oracle DB mit clojure.java.jdbc zu tun.clojure.java.jdbc update wo ID in

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

aber ich bin immer:

java.sql.SQLException: Invalid column index 

Ich bin sicher, dass alle Datentypen korrekt sind. Es sieht so aus, als ob diese Art von Konstruktionen mit clojure.java.jdbc nicht erlaubt sind. Jedes Feedback ist sehr

geschätzt

Antwort

2

Aus irgendwelchen Gründen setzen kann, ist es ziemlich schwer, darauf mit einer vorbereiteten Erklärung für die meisten Datenbanken: es gibt Auswirkungen auf die Sicherheit und die Syntax für die verschiedenen Datenbanken variiert in diesem Punkt.

Ich bin nicht ganz sicher, ob dies mit dem clojure jdbc-Paket machbar ist. Für Oracle könnten Sie versuchen, auf das Oracle java jdbc-Paket zurückzugreifen, eine ARRAY-Typ-Instanz zu erstellen und diese als einzelnen Parameter zu übergeben. Official doc

Wie @Timothy Pratley schrieb, ist die häufigste Lösung, so viele Platzhalter anzuhängen, wie Elemente, die Sie haben. Einige andere Alternativen wurden diskutiert here

1

Sie benötigen in (?, ?) ... das ist es, Ihnen die gleiche Anzahl von Fragezeichen müssen wie Dinge suchen .... (str/join ", " (repeat n "?")) und Sie müssen die params kein Vektor sein:

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

Beachten Sie, dass die sQL-und Argumente zusammen in einem Vektor

+0

Ich versuchte, bevor Frage :) Ich bekomme: 'ava.sql.SQLException: SQL-Anweisung ausführen kann nicht leer oder null sein ' – r00tt

+0

Dies ist die richtige Antwort. Sie könnten Ihren Code erneut posten, um mit der besonderen Ausnahme umzugehen, die Sie sehen. Außerdem gibt es viele Bibliotheken, die Ihnen bei dieser Art von Problem helfen werden: [HugSQL] (http://www.hugsql.org), [Honey SQL] (https://github.com/jkk/honeysql) –