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

标签 java sql-server stored-procedures jdbc user-defined-types

我们在 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/14545844/

相关文章:

java - 如何从其他 JAR 文件加载资源

java - 将 JMX html 适配器与 Apache Camel JMX 结合使用

sql - 选择具有 MAX(Date) 的记录但没有获得不同的返回

mysql .net 连接器不适用于 .net 4.0 项目和带有 sprocs 的连接器 6.4.3

azure - 宇宙数据库 : Dynamic Input and Output in Stored Procedure

java - 如何以编程方式获取 Lantronix XPort IP 地址

java - 如何在Java中创建通用数组?

sql - 与 NULL 合并

.net - 当数据库中数据不可用时测试 SQL Server 存储过程的任何工具。

json - 在 JPA 中检索 Postgres 函数 JSON 类型