2016-04-12 5 views
-1

Ich habe Abfrage wieSELECT * from TableName WHERE id= ?Pass Integer Array für Spalte Nummer in der Datenbank

für id Feld sieht Ich möchte Array von IDs, die in Feld Nummer Database passieren,

I Anzahl Array-Typ i erstellt haben Datenbank, wenn ich Array zu meiner vorbereiteten Aussage übergebe, erhalte ich folgenden Fehler.

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT * from Tablename WHERE id= ?]; nested exception is java.sql.SQLSyntaxErrorException: ORA-00932: inconsistent datatypes: expected NUMBER got schema.app_id 

    at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:95) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) 
    at org.springfra 
+5

Zeigen Sie uns die entsprechende Java-Code. –

+0

Sie können Array von int an diese sql native Abfrage nicht übergeben. Sie sollten Schleife verwenden, um die Abfrage mehrmals auszuführen und speichern Sie das Ergebnis in einem 'Object [] []' Type .. –

+0

Ich glaube nicht, dass Kontext diese Abfrage in einer Schleife mehrmals für verschiedene ID ausgeführt wird, ist a gute Idee. Ich denke, dass die Übergabe einer Liste und Ausführen der Anweisung mit IN where-Klausel wie folgt: "Wählen Sie * aus MYTABLE, wo ID in (1, 2, 3, 4, 5)" Sie bessere Leistung bekommen ... Sie können eine Methode erstellen um das Array zu csv string (oder es ist bereits in der Klasse, ich bin nicht dieser Java-Typ tbh) –

Antwort

0

Sie benötigen einen table collection expression in Ihrer Abfrage verwenden:

Die table_collection_expression können Sie Oracle informieren, dass der Wert von collection_expression sollte als Tabelle für die Zwecke der Abfrage und DML-Operationen behandelt werden. collection_expression kann eine Unterabfrage, eine Spalte, eine Funktion oder ein Auflistungskonstruktor sein. Unabhängig von seiner Form muss es einen Auflistungswert zurückgeben, dh einen Wert, dessen Typ geschachtelte Tabelle oder Varray ist. Dieser Prozess des Extrahierens der Elemente einer Sammlung wird als Sammlungsnesting bezeichnet.

So müssen Sie Ihre übergebene Sammlung (Array) zu einer Tabelle in einer Unterabfrage in Ihrem in() Klausel konvertieren:

SELECT * from TableName WHERE in (SELECT column_value FROM TABLE(?)) 

Oder mit einem Join:

SELECT t.* 
FROM TABLE(?) i 
JOIN TableName t 
ON t.id = i.column_value 
+0

Danke Alex für die Hilfe, ich werde versuchen und dich wissen lassen. –

Verwandte Themen