JavaでSELECT結果とRETURNコードを吐き出すストアドを叩いて見る
ストアド
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のできはやはり秀逸。