</p> 不才面的实例中,将向此函数传递 AdventureWorks 示例数据库的打开毗连,然后使用 execute 体例挪用 GetImmediateManager 存储过程:
. a$ a& D+ k; E, |" H8 J! V ; `/ b6 H( F& t8 O7 b
public static void executeStoredProcedure(Connection con) {
3 H V+ O) }8 m9 f: s( I$ P5 S, J try {
; t. u# l, T5 c( l# B3 [0 @$ ?0 Y CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}");
7 A1 K9 [- r4 s cstmt.setInt(1, 5);
" h# T) ^$ M6 H! _& P' X' E, _/ L cstmt.registerOutParameter(2, java.sql.Types.INTEGER);
( k$ D, j# A5 U3 n cstmt.execute();
~7 `7 k0 r) V7 W2 M+ v; T5 K System.out.println("MANAGER ID: " + cstmt.getInt(2));- d! m: o! `: G8 p- }8 r5 B/ G
}9 b0 F. x6 Z2 D3 t) C
catch (Exception e) {
* |4 M1 f% @! ?. ^' N+ d4 V e.printStackTrace();
# ?, Z7 Z5 _# E7 I' t' I }+ t4 @2 S3 o. X5 L$ X
}4 {( ~* w! L6 o, o0 G
本示例使用序号位置来标识参数。或者,也可以使用参数的名称(而非其序号位置)来标识此参数。下面的代码示例改削了上一个示例,以声名若何在 Java 应用轨范中使用命名参数。请注重,这些参数名称对应于存储过程的界说中的参数名称:
, T2 _4 X, y5 s3 q! U' f' m/ D public static void executeStoredProcedure(Connection con) {+ T: e* \- M/ O( y/ P8 m; k0 \& b
try {+ J/ X9 p- k% K! D2 }3 ]1 F9 m& ?, I
CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}");
4 j2 d4 K6 c3 o cstmt.setInt("employeeID", 5);
0 E x9 |/ E0 p* N2 T/ L2 l5 U cstmt.registerOutParameter("managerID", java.sql.Types.INTEGER);
$ H& `! e5 V4 c4 O9 f$ k8 S cstmt.execute();
! ~& e8 g. k$ n, f+ `/ }# N/ Z System.out.println("MANAGER ID: " + cstmt.getInt("managerID"));2 d8 z; g. N, [) o
cstmt.close();- ?; f9 s X0 S7 d- G
}4 K, X3 i+ m7 E {* {
catch (Exception e) {
7 ~, i$ k) Q& l9 f6 M/ B/ b7 P e.printStackTrace();1 \+ ?/ Q4 [+ X5 o3 ^% F
}
, q8 @8 a0 o( Z9 X* H } y" c/ y7 @. g. `8 Y
注重:, o3 L2 \- \3 [# Z5 K
这些示例使用 SQLServerCallableStatement 类的 execute 体例来运行存储过程。使用此体例是因为存储过程也不会返回结不美观集。如不美观返回,则使用 executeQuery 体例。4 [5 G+ A& z, F' p4 ~) P+ T
存储过程可能返回更新计数和多个结不美观集。Microsoft SQL Server 2005 JDBC Driver 遵循 JDBC 3.0 规范,此规范划定在检索 OUT 参数之前应检索多个结不美观集和更新计数。也就是说,应用轨范应先检索所有 ResultSet 对象和更新计数,然后使用 CallableStatement.getter 体例检索 OUT 参数。否则,当检索 OUT 参数时,尚未检索的 ResultSet 对象和更新计数将丢失踪。有关更新计数和多个结不美观集的具体信息,请参阅使用带有更新计数的存储过程和使用多个结不美观集。 |