0

ユーザー定義変数を使用した以下のMS SQLストアプロシージャがあります(@Location

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();
  }

ここで、私の質問は、@LocationJava から変数を作成し、それを MS SQL データベースに渡す方法です。(sqljdbc4.jar ドライバーを使用してデータベースに接続しています)

私は一日中グーグルで検索し、多くの実装を試しましたが、何も報われませんでした。

誰かがこれにいくつかの光を当ててください...

4

1 に答える 1

1

Locationtype(テーブル変数として宣言したと仮定します。ReadOnlyストアド プロシージャのパラメーターでの on の使用は、これを示唆しています。)

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()。sproc コードがなかったのでOrganization_Insert、テーブル変数の行数を含むメッセージのエラーを発生させました。executeQuery()このエラー メッセージをスローするには、を使用する必要がありました。 SQLException:execute()例外はスローされませんでした。)

于 2014-11-16T12:46:12.590 に答える