Archiv des Intrexx Live! Forums

Hier sehen Sie die Foreneinträge aus dem Intrexx Live! Forum. Bis November 2016 war es das Forum für alle Fragen rund um die Software Intrexx von United Planet.
Seit November 2016 gibt es ein neues moderiertes Forum, das Intrexx Community Forum. Nutzen Sie bitte unbedingt dieses für aktuelle Fragen, Antworten und Informationen.

Wichtig: Dieses Forum dient als Archiv. Die Einträge beziehen sich oft auf ältere Versionen von Intrexx und entsprechen nicht mehr den aktuellen technischen Gegebenheiten.
Daher sollten alle Inhalte ausschließlich von Experten genutzt werden. Bei unsachgemäßer Anwendung kann es zu zeitaufwändigen Problemen oder Datenverlust kommen.
Übersicht > Intrexx Professional: Programming > VTL Parameter für SQL IN

VTL Parameter für SQL IN

Hallo,


ich habe ein VTL-Skript mit einer SQl Abfrage. In dieser Abfrage verwende ich den SQl IN als Filter.

Wie setzte ich in VTL den Parameter richtig damit dieser im Filter auch korrekt berücksichtigt wird ?

Die Verwendung des Parameters (roter Rahmen in Bild) funktioniert so nicht, habt Ihr einen Tip für mich ?

Plaziere ich die in Parameter2 angegebenen Werte direkt in die SQl Abfrage klappt es !
17.03.2016 12:38 von AndreR
ich vermute du musst pro Wert der verglichen werden soll ein Fragezeichen einbauen.
Also auch einen fragezeichenstring per Schleife zusammensetzen.
17.03.2016 13:11 von MartinW
Hast du mit
Expression ANY (array expression)
probiert?
18.03.2016 07:43 von lisaL
Leider wird das so nicht funktionieren.
Die setString-Methode setzt ja einen String ein, escaped dabei Quotes, etc. und fasst das ganze je nach DB in Single-Quotes.
Aus deinem String
"'40','42','44'" wird im SQL-Query als
'\'40\',\'42\',\'44\'' eingesetzt. Daher wirft die SQL-Abfrage zwar keinen Fehler, aber es gibt natürlich kein korrektes Ergebnis.

Die Möglichkeit über die Array-Expression
ANY (?), wie von lisaL vorgeschlagen, wird noch nicht unterstützt. Dazu müsste Intrexx, wie auch die DB im PreparedStatement die
setArray-Methode (JDBC4) unterstützen. Soweit sind wir noch nicht.

Zu ermitteln, wieviele Parameter innerhalb der IN-Expression gesetzt werden müssen, um dann entsprechend viele Fragezeichen einzubauen ist aus Performance-Gründen uninteressant, da dann bei wechselnden Parameter-Zahlen das PreparedStatement immer neu aufgebaut werden muss. Damit geht der Sinn eines PreparedStatement verloren.
Siehe dazu Java ist auch eine Insel > Vorbereitete Anweisungen (Prepared Statements).
Zusätzlich noch ein Code-Beispiel:
## Beispiel falsche (nicht perfomante) Anwendung des PreparedStatement
## ****************************************
<ul>
#foreach( $itemId in $itemIdArray )
<li>Entry $itemId</li>
<ul>
#set( $stm = $PreparedQuery.prepare($DbConnection, "SELECT childid FROM DATAGROUP('A5DF....43B6') WHERE fklid = ?") )
$stm.setInt(1, $itemId)
#set( $rs = $stm.executeQuery() )
#foreach( $row in $rs.iterator() )
<li>Child $row.getIntValue(1)</li>
#end
$rs.close()
$stm.close()
</ul>
#end
</ul>


## Beispiel richtige (perfomante) Anwendung des PreparedStatement
## Man beachte die Erstellung des PreparedStatements ausserhalb der äußeren foreach-Schleife
## ****************************************
#set( $stm = $PreparedQuery.prepare($DbConnection, "SELECT childid FROM DATAGROUP('A5DF....43B6') WHERE fklid = ?") )
<ul>
#foreach( $itemId in $itemIdArray )
<li>Entry $itemId</li>
<ul>
$stm.setInt(1, $itemId)
#set( $rs = $stm.executeQuery() )
#foreach( $row in $rs.iterator() )
<li>Child $row.getIntValue(1)</li>
#end
$rs.close()
</ul>
#end
</ul>
$stm.close()

Falls also deine Abfrage nicht mehrmals mit wechselnden Parametern in einer Schleife ausgeführt werden soll, spricht nichts dagegen, die Parameter direkt in den Query-String einzubauen:
#set( $inKeys = "'40','42','44'" )
#set( $stm = $PraparedQuery.prepare($DbConnection, "SELECT .... FROM .... WHERE key IN (${inKeys})") )

Parameter müssen also nicht immer über die set...-Methoden des PreparedStatement gesetzt werden. In manchen Fällen ist es mit diesen aber einfacher, da gewisse Umwandlungen dann nicht selbst durchgeführt werden müssen, wie zum Beispiel mit der Methode
setTimestamp.

Zu guter Letzt bleibt auch noch die Möglichkeit, die Parameter dynamisch über ein Sub-Select zu ermitteln:
#set( $stm = $PreparedQuery.prepare($DbConnection, "SELECT .... FROM .... WHERE key IN (SELECT DISTINCT key FROM .... WHERE ....)") )


Gruß
20.03.2016 12:32 von handw3rker
Zurück | Alles über Intrexx | Impressum | Datenschutzerklärung

Über United Planet
© 2019 United Planet GmbH
Schnewlinstraße 2
79098 Freiburg