繁体   English   中英

如何使用Spring JDBC存储过程从Java将用户定义的数据类型变量的值传递给MS SQL

[英]How to pass the values of user defined datatype variable to MS SQL from java using spring jdbc store procedure

我有以下带有用户定义的变量( @Location MS SQL存储过程

CREATE PROCEDURE [Organization].[Organization_Insert]   
(  
 @OrganizationID NVARCHAR(256),  
 @Location Locationtype ReadOnly
)

@Location具有以下属性:OrganizationSubID,LocationCode

我正在使用下面的java类来调用存储过程,

class OrganizationInsertProcedure extends StoredProcedure {

  private final String[] outputParameters = new String[] {OUTPUT};

  public PlanActivityInsertProcedure(DataSource dataSource) {
    super(dataSource, "Organization_Insert");

    declareParameter(new SqlParameter("@OrganizationID", Types.NVARCHAR));
    declareParameter(new SqlParameter("@Location", Types.ARRAY, "Locationtype"));

    compile();
  }

在这里,我的问题是,如何从java构造@Location变量并将其传递给MS SQL数据库。 (上午使用sqljdbc4.jar驱动程序连接数据库)

我整天用Google搜索并尝试了许多实现,但没有得到回报。

请有人对此有所启发...

(我将假设您已将Locationtype声明为表变量。在存储过程的参数上使用ReadOnly提示这一点。)

根据SQL Server论坛上的这篇文章 ,Microsoft SQL Server JDBC驱动程序当前不支持表变量。 因此,似乎您必须构建一个T-SQL字符串,该字符串声明一个表变量,将数据插入表中,然后执行存储过程。

在“普通” JDBC中,即不使用Spring,执行此操作的代码如下所示:

    int numRows = /* number of rows in table variable */;

    StringBuilder sqlBuilder = new StringBuilder("DECLARE @Location AS LocationType;");
    for (int i = 0; i < numRows; ++i) {
        sqlBuilder.append(
            "INSERT INTO @Location (OrganizationSubID, LocationCode) VALUES (?, ?);");
    }

    sqlBuilder.append("EXEC [Organization].[Organization_Insert] ?, @Location;");

    PreparedStatement stmt = connection.prepareStatement(sqlBuilder.toString());
    for (int i = 0; i < numRows; ++i) {
        stmt.setString(i * 2 + 1, /* OrganizationSubID for row i */);
        stmt.setString(i * 2 + 2, /* LocationCode for row i  */);
    }

    stmt.setString(numRows * 2 + 1, /* Organization ID */);

    ResultSet resultSet = stmt.executeQuery();
    resultSet.close();

(我发现它更有助于调用executeQuery()上的PreparedStatement比execute()我没有你的存储过程的代码,所以我做了Organization_Insert提高其消息包含的行数表中的变量。使用错误executeQuery()是使此错误消息抛出SQLException所必需的:使用execute()不会引发任何异常。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM