3

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() {
    }
}
4

2 に答える 2

6

はい、可能になりました。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 記事を参照してください。

テーブル値パラメーターの使用

于 2017-01-01T16:40:50.177 に答える
0

この方法で試してください:

connection = dataSource.getConnection();
CallableStatement statement = connection.prepareCall("{? = call dbo.RegisterInitAssets(?)}");
statement.registerOutParameter(1, OracleTypes.CURSOR);//you can skip this if procedure won't return anything
statement.setObject(2, new InitvalsMsg()); //I hope you some kind of representation of this table in your project
statement.execute();

ResultSet set = (ResultSet) statement.getObject(1);//skip it too if its not returning anything
于 2013-01-27T09:11:30.527 に答える