gpt4 book ai didi

java - 使用 JDBC 将用户定义的表类型传递给 SQL Server 存储过程

转载 作者:行者123 更新时间:2023-12-01 18:13:05 25 4
gpt4 key购买 nike

我们在 SQL Server 中有这个用户定义的表类型:

CREATE TYPE [dbo].[INITVALS_MSG] AS TABLE(
[SDate] [decimal](8, 0) NOT NULL,
[EDate] [decimal](8, 0) NOT NULL,
[PlantCode] [nvarchar](10) NOT NULL,
[LoadType] [nchar](8) NOT NULL,
[Asset] [bigint] NOT NULL
)

以及一个将该表作为输入的存储过程:

ALTER PROCEDURE [dbo].[RegisterInitAssets]
@initmsg INITVALS_MSG ReadOnly
AS
BEGIN
...

现在,我需要从 java 调用这个过程。可以做这样的事吗? JDBC 支持这个吗?

--------编辑我在 java 中有一个对应于该类型的类:

public class DBInitialAsset {
private Integer sDate;
private Integer eDate;
private String plantCode;
private String loadType;
private Integer asset;

public DBInitialAsset() {
}
}

最佳答案

是的,现在可以了。 Microsoft SQL Server 的 JDBC 驱动程序 6.0 版添加了对表值参数的支持。

以下代码示例展示了如何

  • 使用SQLServerDataTable对象来保存要传递的表数据,并且
  • 调用 SQLServerCallableStatement#setStructured 方法将该表传递给存储过程。
SQLServerDataTable sourceDataTable = new SQLServerDataTable();   
sourceDataTable.addColumnMetadata("SDate", java.sql.Types.DECIMAL);
sourceDataTable.addColumnMetadata("EDate", java.sql.Types.DECIMAL);
sourceDataTable.addColumnMetadata("PlantCode", java.sql.Types.NVARCHAR);
sourceDataTable.addColumnMetadata("LoadType", java.sql.Types.NCHAR);
sourceDataTable.addColumnMetadata("Asset", java.sql.Types.BIGINT);

// sample data
sourceDataTable.addRow(123, 234, "Plant1", "Type1", 123234);
sourceDataTable.addRow(456, 789, "Plant2", "Type2", 456789);

try (CallableStatement cs = conn.prepareCall("{CALL dbo.RegisterInitAssets (?)}")) {
((SQLServerCallableStatement) cs).setStructured(1, "dbo.INITVALS_MSG", sourceDataTable);
boolean resultSetReturned = cs.execute();
if (resultSetReturned) {
try (ResultSet rs = cs.getResultSet()) {
rs.next();
System.out.println(rs.getInt(1));
}
}
}

有关更多详细信息,请参阅以下 MSDN 文章:

Using Table-Valued Parameters

关于java - 使用 JDBC 将用户定义的表类型传递给 SQL Server 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60426482/

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