a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 111|回复: 1

[基础知识] JAVA基础:JDBC调用存储过程

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
您可根柢用的 SQL Server 存储过程是返回一个或多个 OUT 参数的存储过程,存储过程使用这些参数将数据返回到挪用它的应用轨范。可以使用 Microsoft SQL Server 2005 JDBC Driver 供给的 SQLServerCallableStatement 类,挪用此类存储过程并措置其返回的数据。   使用 JDBC 驱动轨范挪用此类存储过程时,必需连系 SQLServerConnection 类的 prepareCall 体例使用 call SQL 转义序列。带有 OUT 参数的 call 转义序列的语法如下所示:
- m$ \, M/ x* K! \6 c  C& c  {call procedure-name[([parameter][,[parameter]]...)]}+ E% f! c; d5 T9 M
  注重:- K: s7 n, ~; V, r( B6 U
  有关 SQL 转义序列的具体信息,请参阅使用 SQL 转义序列 。5 L& O+ b& H( P- D
  机关 call 转义序列时,请使用 ?(问号)字符来指定 OUT 参数。此字符充任要年夜该存储过程返回的参数值的占位符。要为 OUT 参数指定值,必需在运行存储过程前使用 SQLServerCallableStatement 类的 registerOutParameter 体例指定各参数的数据类型。3 G4 N3 \8 r8 p5 `- _2 ^( o
  使用 registerOutParameter 体例为 OUT 参数指定的值必需是 java.sql.Types 所包含的 JDBC 数据类型之一,而它又被映射成当地 SQL Server 数据类型之一。有关 JDBC 和 SQL Server 数据类型的具体信息,请参阅体味 JDBC 驱动轨范数据类型。1 d% @. ?* ~% E- {
  当您对于 OUT 参数向 registerOutParameter 体例传递一个制瘫,不仅必需指定要用于此参数的数据类型,而且必需在存储过程中指定此参数的序号位置或此参数的名称。例如,如不美观存储过程包含单个 OUT 参数,则其序数值为 1;如不美观存储过程包含两个参数,则第一个序数值为 1,第二个序数值为 2。* d! G* z/ x! ^, A0 r' f
  注重:
+ v/ }6 N; n, ]  JDBC 驱动轨范不撑持将 CURSOR、SQLVARIANT、TABLE 和 TIMESTAMP SQL Server 数据类型用作 OUT 参数。" Y0 ?. L1 c) B/ X/ Y# j1 q- {  y
  作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中建树以下存储过程:
8 h5 L" T6 e4 h/ y1 r  7 p/ N; A7 {% h9 `+ G. S
  CREATE PROCEDURE GetImmediateManager0 N5 n$ o: E4 T3 ]* G
  @employeeID INT,
; [* H$ K5 x7 z; R  b  @managerID INT OUTPUT
4 [" I9 B( S. Z9 y% j% e  AS
0 Y- n% u  u5 Y& ^  BEGIN5 B  l  v% l& [- K5 l, A
  SELECT @managerID = ManagerID7 ^8 O! q' G3 n
  FROM HumanResources.Employee
" M" M% F( U# N: v7 f$ A  WHERE EmployeeID = @employeeID3 [0 ?) t! }$ i: [! \# o
  END
! l0 {1 D- v; V
! S1 `; Q* x. h  按照指定的整数 IN 参数 (employeeID),该存储过程也返回单个整数 OUT 参数 (managerID)。按照 HumanResources.Employee 表中包含的 EmployeeID,OUT 参数中返回的值为 ManagerID。
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:37:28 | 显示全部楼层

JAVA基础:JDBC调用存储过程

</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 对象和更新计数将丢失踪。有关更新计数和多个结不美观集的具体信息,请参阅使用带有更新计数的存储过程和使用多个结不美观集。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-15 21:13 , Processed in 0.259877 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表