JavaでSELECT結果とRETURNコードを吐き出すストアドを叩いて見る

理解できること

  • JavaからSQLServerのストアドの叩き方
  • 日付パラメーターの扱い
  • SELECT結果とReturn値の両方を返すストアドからの値取得
  • 初歩的なJDBCプログラミングの作法

ストアド

NorthWindをSQLServer2014 Expressにインストール
各インストール方法は割愛します。
対象プロシージャーは下記のようにちょっとかえてSELECT結果とreturnを返すようにしている。

USE [Northwind]
GO
/****** Object:  StoredProcedure [dbo].[Employee Sales by Country]    Script Date: 2017/01/27 15:37:04 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER procedure [dbo].[Employee Sales by Country] 
@Beginning_Date DateTime, @Ending_Date DateTime AS
SELECT Employees.Country, Employees.LastName, Employees.FirstName, Orders.ShippedDate, Orders.OrderID, "Order Subtotals".Subtotal AS SaleAmount
FROM Employees INNER JOIN 
	(Orders INNER JOIN "Order Subtotals" ON Orders.OrderID = "Order Subtotals".OrderID) 
	ON Employees.EmployeeID = Orders.EmployeeID
WHERE Orders.ShippedDate Between @Beginning_Date And @Ending_Date
RETURN 10

Java

これをJavaから叩いてみる。
別途MSからJDBCのjarをダウンロードして突っ込んでビルドパス通しておく。
あとは一般的なJDBCプロミングと変わらないけれど、
ResultSetの取得後にReturn値の取得という順番でいかないとダメっぽい。

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;


public class Main {

	private static final String JDBC_URL="jdbc:sqlserver://localhost:1433;databaseName=NorthWind";
	private static final String USER = "sa";
	private static final String PWD = "xxxxxx";
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Connection con = null;
		CallableStatement cs = null;
		ResultSet rs = null;
		String sql = "{? = call dbo.[Employee Sales by Country](@Beginning_Date = ? ,@Ending_Date = N'1997/07/01' )}";
			
		try {
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			con = DriverManager.getConnection(JDBC_URL,USER,PWD);
			cs = con.prepareCall(sql);
			cs.registerOutParameter(1, java.sql.Types.INTEGER);
			cs.setDate(2, java.sql.Date.valueOf("1997-01-01"));
			
			if(! cs.execute()){
				System.out.println("Execution failed");
			}
			
			rs = cs.getResultSet();
			
			while(rs != null && rs.next()){
				System.out.print(rs.getObject(1) + "\t");
				System.out.print(rs.getObject(2) + "\t");
				System.out.print(rs.getObject(3) + "\t");
				System.out.print(rs.getObject(4) + "\t");
				System.out.print(rs.getObject(5) + "\t");
				System.out.println("");
			}
			// 順番大事
			int retCode = cs.getInt(1);
			System.out.println(retCode);

		} catch (Exception e){
			e.printStackTrace();
		} finally {
			forceClose(rs);
			forceClose(cs);
			forceClose(con);
		}
	
	}

	private static void forceClose(AutoCloseable c) {
        if (c == null) {
            return;
        }
        try {
            c.close();
        }
        catch (Exception ignore) {
           ignore.printStackTrace();
        }
    }

}

出力結果

USA	Callahan	Laura	1997-01-16 00:00:00.0	10380	
USA	Fuller	Andrew	1997-01-01 00:00:00.0	10392	
USA	Davolio	Nancy	1997-01-03 00:00:00.0	10393	
USA	Davolio	Nancy	1997-01-03 00:00:00.0	10394	
UK	Suyama	Michael	1997-01-03 00:00:00.0	10395	
USA	Davolio	Nancy	1997-01-06 00:00:00.0	10396
 .....
10	


10年ぶりにSQLServer触ったけどなかなかよいね。Management Studioのできはやはり秀逸。