gpt4 book ai didi

sql - 从java调用带有表值参数的存储过程

转载 作者:行者123 更新时间:2023-12-02 01:47:37 24 4
gpt4 key购买 nike

在我的应用程序中,我想执行类似 SELECT * FROM tbl WHERE col IN (@list) 的查询,其中,@list 可以有可变的值。我正在使用 MS SQL 服务器数据库。当我用谷歌搜索这个问题时,我发现了这个链接

http://www.sommarskog.se/arrays-in-sql-2008.html

此链接表示使用表值参数。因此,我使用 Microsoft SQL Server Management Studio 创建了用户定义的数据类型。

创建类型integer_list_tbltype AS TABLE(n int NOT NULL PRIMARY KEY)

然后我写了存储过程

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)

然后仅使用 Management Studio 我执行了此过程

DECLARE @mylist integer_list_tbltype
INSERT @mylist(n) VALUES(9),(12),(27),(37)
EXEC get_product_names @mylist

它给了我正确的输出。但我想知道如何从java源代码调用这个存储过程。我知道如何使用常量参数调用简单的存储过程

CallableStatement proc_stmt = null;
proc_stmt = con.prepareCall("{call test(?)}");
proc_stmt.setString(1,someValue);

但是如何在表值参数的情况下调用存储过程呢?

最佳答案

这记录在 JDBC driver manual 中。对于您的情况,您必须这样做:

try (SQLServerCallableStatement stmt =
(SQLServerCallableStatement) con.prepareCall("{call test(?)}")) {

SQLServerDataTable table = new SQLServerDataTable();
sourceDataTable.addColumnMetadata("n", java.sql.Types.INTEGER);

sourceDataTable.addRow(9);
sourceDataTable.addRow(12);
sourceDataTable.addRow(27);
sourceDataTable.addRow(37);

stmt.setStructured(1, "dbo.integer_list_tbltype", table);
}

I've also recently documented this in an article .

关于sql - 从java调用带有表值参数的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16047818/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com