In meiner Anwendung möchte ich Abfrage wie ausführen SELECT * FROM Tabl WHERE Spalte IN (@list) wo, @ Liste kann Variable keine Werte. Ich benutze MS SQL Server Datenbank. Wenn ich dieses Problem google dann fand ich diesen LinkAufruf gespeicherte Prozedur mit Tabellenwert-Parameter von Java
http://www.sommarskog.se/arrays-in-sql-2008.html
Dieser Link sagt Tabellenwertparameter zu verwenden. Also habe ich einen benutzerdefinierten Datentyp mit Microsoft SQL Server Management Studio erstellt.
CREATE TYPE integer_list_tbltype AS TABLE (n int NOT NULL PRIMARY KEY)
Dann schrieb ich gespeicherte Prozedur
CREATE PROCEDURE get_product_names @prodids integer_list_tbltype READONLY AS
SELECT p.ProductID, p.ProductName
FROM Northwind.dbo.Products p
WHERE p.ProductID IN (SELECT n FROM @prodids)
und dann Management Studio nur ausgeführt ich diese Prozedur
DECLARE @mylist integer_list_tbltype
INSERT @mylist(n) VALUES(9),(12),(27),(37)
EXEC get_product_names @mylist
und es gibt mir korrekte Ausgabe. Aber ich frage mich, wie ich diese gespeicherte Prozedur aus Java-Quellcode aufrufen soll. Ich weiß, wie einfache gespeicherte Prozedur mit konstanter Anzahl von Argumenten aufgerufen wird
CallableStatement proc_stmt = null;
proc_stmt = con.prepareCall("{call test(?)}");
proc_stmt.setString(1,someValue);
aber wie gespeicherte Prozedur in Tabelle-Wert-Parameter-Fall aufgerufen wird?
Das Problem mit diesem Ansatz besteht darin, dass es den Anweisungscache füllen kann. –
@ngund Hallo, ich habe diese Lösung versucht, und wenn ich es gut verstanden habe, habe ich Folgendes getan: m_cStatement.setString ("1,2,3")); und dann habe ich die folgende Ausnahme: "Operand typ clash: nvarchar ist inkompatibel mit udt_UsersById". Kannst du bitte beraten? (Ich habe eine Frage zu http://stackoverflow.com/questions/31161789/what-is-the-java-equivalent-to-sql-user-de-fined-table-type gestellt und sie wurde als dupliziert markiert. Kannst du eine schau bitte?) 10X! – dushkin
Das Problem damit ist, es könnte Sie bis zur SQL-Injektion öffnen –