Ich versuche, einen Flow in Mule zu erstellen, die Abfragen in einer Tabelle mit einer dynamischen Where-Anweisung ermöglichen. Die Idee ist, eine Karte von Parametern mit null oder mehr Einträge zu senden und dann eine Abfrage-Zeichenfolge daraus zu erstellen.Sehr dynamische JDBC-Abfrage in Mule
Ich benutze hsqldb zum Testen und bekomme einige seltsame Fehler über unerwartete Token. Hier
ist der Fluss:
<script:transformer name="extractParameters">
<script:script file="extractParameters.groovy" engine="groovy"/>
</script:transformer>
<flow name="datafetch.flow">
<vm:inbound-endpoint address="vm://datafetch" exchange-pattern="request-response"/>
<enricher target="#[variable:where-statement]">
<transformer ref="extractParameters"/>
</enricher>
<jdbc:outbound-endpoint connector-ref="datasource"
queryKey="parameterized-select"
exchange-pattern="request-response"
mimeType="text/plain">
<jdbc:query key="parameterized-select"
value="select * from ${datasource.table} #[variable:where-statement]"/>
</jdbc:outbound-endpoint>
<json:object-to-json-transformer name="CaseInsensitiveHashMapToJson"/>
</flow>
Der enricher ist ein starkes Skript, das eine json-Struktur an die Where-Anweisungszeichenfolge konvertiert:
import groovy.json.JsonSlurper
def input = new JsonSlurper().parseText(payload)
def parameters = input?.get("parameters")
def result = ""
if(parameters==null) return result
def where = parameters.inject([]) { list, entry -> list << "${entry.key}=${entry.value}"}.join(" AND ")
if (where.isEmpty()) return result
result = "where " + where
return result
empty Parameter resultieren in der Anreicherungs Senden Herstellung eine leere Zeichenfolge, und die Fehler sind:
1. unexpected token: ? (org.hsqldb.HsqlException)
org.hsqldb.error.Error:-1 (null)
2. unexpected token: ?(SQL Code: -5581, SQL State: + 42581) (java.sql.SQLSyntaxErrorException)
org.hsqldb.jdbc.Util:-1 (null)
3. unexpected token: ? Query: select * from TABLE1 ? Parameters: [](SQL Code: -5581, SQL State: + 42581) (java.sql.SQLException)
org.apache.commons.dbutils.QueryRunner:540 (null)
Senden eines Parameters (C1 = 0) Führt zur enricher Herstellung der String „wobei C1 = 0“, und die Fehler sind:
1. unexpected token: ? (org.hsqldb.HsqlException)
org.hsqldb.error.Error:-1 (null)
2. unexpected token: ?(SQL Code: -5581, SQL State: + 42581) (java.sql.SQLSyntaxErrorException)
org.hsqldb.jdbc.Util:-1 (null)
3. unexpected token: ? Query: select * from TABLE1 ? Parameters: [where C1=0](SQL Code: -5581, SQL State: + 42581) (java.sql.SQLException)
org.apache.commons.dbutils.QueryRunner:540 (null)
So sieht es aus wie die Abfrage etwas anderes als ein String erwartet, wo ich also #[variable:where-statement]
geschrieben , was muss ich in die Variable where-statement
eingeben, damit dies funktioniert? Oder gibt es eine andere Möglichkeit, dies zu spezifizieren?
, dass es tatsächlich funktioniert Fand heraus, wenn ich die uri-basierten Endpunktversion anstelle des transportspezifischen Endpunkt wie folgt verwenden : ' ' –
hdohlmann
kann ich nicht bekommen Der oben genannte Tag validiert in mule studio. Es scheint einen QueryKey attr zu erfordern. (edit: version: 3.4.0) – Rondo
immer noch keine Freude ... Ich habe
Rondo