java调用存储过程
- 格式:pdf
- 大小:225.70 KB
- 文档页数:5
java通过调⽤存储过程获取结果集⼀般在java中,数据查询是通过Statement, PreparedStatement获取结果集,今天向⼤家介绍通过CallableStatement调⽤存储过程,从⽽获取结果集. 本⽂是所⽤的数据库为oracle. ⼀. 测试数据库表:sql 代码1. create table wilent_user(2. id number(5) primary key,3. name varchar2(100),4. sex varchar2(1), --Y为男,F为⼥;5. group_id number(5),6. teach varchar2(50) --学历;7. );8.9. create table wilent_group(10. id number(5) primary key,11. name varchar2(100)12. );13.14. insert into wilent_group values(1,'组1');15. insert into wilent_group values(2,'组2');16. insert into wilent_group values(3,'组3');17. insert into wilent_group values(4,'组4');18. insert into wilent_group values(5,'组5');19.20. insert into wilent_user values(1,'吴','Y',1,'⼤专');21. insert into wilent_user values(2,'李','Y',1,'⼤专');22. insert into wilent_user values(3,'赵','N',2,'本科');23. insert into wilent_user values(4,'⾦','Y',2,'⾼中');24. insert into wilent_user values(5,'钱','N',2,'⼤专');25. insert into wilent_user values(6,'孙','N',1,'⼤专');26. insert into wilent_user values(7,'⾼','Y',3,'本科');27. insert into wilent_user values(8,'宋','N',3,'⾼中');28. insert into wilent_user values(9,'伍','Y',3,'⼤专');29. insert into wilent_user values(10,'欧','Y',4,'本科');30. insert into wilent_user values(11,'庄','N',4,'硕⼠');31. insert into wilent_user values(12,'纪','Y',4,'本科');32. insert into wilent_user values(13,'陈','Y',5,'⼤专');33. insert into wilent_user values(14,'龙','N',5,'⼤专');34. insert into wilent_user values(15,'袁','Y',5,'⾼中');35. insert into wilent_user values(16,'杨','Y',1,'本科');36. insert into wilent_user values(17,'江','N',1,'⼤专');37. insert into wilent_user values(18,'刘','Y',1,'硕⼠');38. insert into wilent_user values(19,'郭','N',3,'硕⼠');39. insert into wilent_user values(20,'张','Y',3,'⼤专');40. insert into wilent_user values(21,'⽂','N',3,'硕⼠');41. insert into wilent_user values(22,'李','N',4,'⼤专');42. insert into wilent_user values(23,'梅','Y',4,'本科');43. insert into wilent_user values(24,'王','N',4,'⼤专');44. insert into wilent_user values(25,'吕','N',5,'⾼中');45. insert into wilent_user values(26,'范','Y',5,'本科');46. insert into wilent_user values(27,'许','N',1,'⼤专');47. insert into wilent_user values(28,'墨','Y',1,'⾼中');48. insert into wilent_user values(29,'孔','N',1,'本科');49. insert into wilent_user values(30,'蔡','Y',1,'⼤专');⼆. oracle 存储过程sql 代码1. --⾃定义类型;2. Create Or Replace Type wilent_row_table As Object3. (4. group_name Varchar2(100),5. group_count Number(4),6. male_count Number(4),7. woman_count Number(4),8. da_count Number(4),9. ben_count Number(4)10. );11. /12.13. --定义⼀个嵌套表类型;14. Create Or Replace Type wilent_tab_type Is Table Of wilent_row_table;15. /16. --返回⼀个游标类型;17. Create Or Replace Package wilent_types As18. Type cursor_type Is Ref Cursor;19. End wilent_types;20. /21. Create Or Replace Procedure wilent_group_count(recordSet Out wilent_types.cursor_type)22. As23. v_tab wilent_tab_type := wilent_tab_type();24. index_max Number(4); --wilent_group最⼤的id;25. index_min Number(4); --wilent_group最⼩的id;26. index_for Number(4);27.28. group_name Varchar2(100);29. user_count Number(4);30. male_count Number(4);31. woman_count Number(4);32. da_count Number(4);33. ben_count Number(4);34. Begin35. dbms_output.put_line('as');36. Select Max(g.Id) Into index_max From wilent_group g;37. --dbms_output.put_line(index_max);38. Select Min(g.Id) Into index_min From wilent_group g;39. --dbms_output.put_line(index_min);40. For index_for In Index_min..index_max Loop41. --添加新记录;42. v_tab.Extend;43. Select Name Into group_name From wilent_group Where Id=index_for;44. Select Count(*) Into user_count From wilent_user u, wilent_group g Where u.group_id=g.Id And g.Id=index_for;45. Select Count(*) Into male_count From wilent_user u, wilent_group g Where u.group_id=g.Id And g.Id=index_for And sex='Y';46. Select Count(*) Into woman_count From wilent_user u, wilent_group g Where u.group_id=g.Id And g.Id=index_for And sex='N';47. Select Count(*) Into da_count From wilent_user u, wilent_group g Where u.group_id=g.Id And g.Id=index_for And teach='⼤专';48. Select Count(*) Into ben_count From wilent_user u, wilent_group g Where u.group_id=g.Id And g.Id=index_for And teach='本科';49. --把记录写⼊;50. v_tab(v_st) := wilent_row_table(group_name,user_count,male_count,woman_count,da_count,ben_count);51. End Loop;52.53. --把记录放在游标⾥;54. Open recordset For55. --Table(Cast(v_tab As wilent_tab_type))⽬的是把v_tab强转为wilent_tab_type表56. Select group_name,group_count ,male_count ,woman_count ,da_count ,ben_count From Table(Cast(v_tab As wilent_tab_type)) Order By group_name;57. End wilent_group_count;58. /59.60. --测试wilent_group_count();61. declare62. recordset wilent_types.cursor_type;63. Begin64. wilent_group_count(recordset);65. End;三. java代码:java 代码1. package com.wilent.oracle;2.3. import java.sql.CallableStatement;4. import java.sql.Connection;5. import java.sql.ResultSet;6. import java.sql.SQLException;7.8. import oracle.jdbc.driver.OracleTypes;9.10. import com.wilent.db.ConnectionManager;11.12. public class TestProcedure {13. public static void main(String[] args) {14. //获得conn连接,读者可以⾃⾏写;15. Connection conn = ConnectionManager.getConnection();16. ResultSet rs = null;17. try {18. CallableStatement proc = conn.prepareCall("{call wilent_group_count(?)}");19. proc.registerOutParameter(1, OracleTypes.CURSOR);20. proc.execute();21.22. rs = (ResultSet) proc.getObject(1);23. System.out.println("组名\t总计\t男性\t⼥性\t⼤专\t本科");24. while(rs.next())25. {26. StringBuffer buffer = new StringBuffer();27. buffer.append(rs.getString("group_name"));28. buffer.append("\t");29. buffer.append(rs.getInt("group_count"));30. buffer.append("\t");31. buffer.append(rs.getInt("male_count"));32. buffer.append("\t");33. buffer.append(rs.getInt("woman_count"));34. buffer.append("\t");35. buffer.append(rs.getInt("da_count"));36. buffer.append("\t");37. buffer.append(rs.getInt("ben_count"));38. System.out.println(buffer.toString());39. }40. } catch (Exception e) {41. e.printStackTrace();42. }43. finally{44. try {45. conn.close();46. } catch (SQLException e) {47. e.printStackTrace();48. }49. }50. }51. }四. 运⾏结果组名总计男性⼥性⼤专本科组1 10 6 4 6 2 组2 3 1 2 1 1 组3 6 3 3 2 1 组4 6 3 3 2 3组5 5 3 2 2 1。
jfinal调用存储过程JFinal是一款非常优秀的Java Web框架,它提供了很多方便快捷的操作方法,包括调用存储过程。
本文将介绍JFinal如何调用存储过程,以及一些注意事项。
一、准备在使用JFinal调用存储过程之前,需要先准备好以下内容:1. 在数据库中创建存储过程;2. 在JFinal的配置文件中添加数据库连接信息;3. 导入相关的jar包,包括mysql-connector.jar、jfinal.jar等。
二、调用存储过程JFinal调用存储过程的方式很简单,只需要使用e()方法即可。
e()方法有两个参数,第一个参数是数据源名称,第二个参数是要执行的SQL语句。
例如,以下代码调用了一个名为“test”的存储过程:String sql = "{call test(?,?)}";e().call(sql, "param1", "param2");在上面的例子中,通过“{}”括号包裹存储过程的名称和参数,使用“?”作为占位符,然后在调用e().call()方法时,将参数值传入即可。
三、注意事项在调用存储过程时,需要注意以下几点:1. 参数类型要与存储过程中的参数类型一致;2. 如果存储过程返回结果集,可以使用e().query()方法获取结果集;3. 如果存储过程中使用了事务,需要在执行前设置e().tx()。
四、总结本文介绍了JFinal调用存储过程的方法及注意事项。
虽然JFinal的调用方法非常简单,但在实际应用过程中,需要注意参数类型,传递参数的方式等问题。
希望本文能够对JFinal开发人员有所帮助。
java调⽤存储过程、存储函数需要⽤到的接⼝接⼝ CallableStatementJDK⽂档对改接⼝的说明:public interface CallableStatementextends⽤于执⾏ SQL 存储过程的接⼝。
JDBC API 提供了⼀个存储过程 SQL 转义语法,该语法允许对所有 RDBMS 使⽤标准⽅式调⽤存储过程。
此转义语法有⼀个包含结果参数的形式和⼀个不包含结果参数的形式。
如果使⽤结果参数,则必须将其注册为 OUT 参数。
其他参数可⽤于输⼊、输出或同时⽤于⼆者。
参数是根据编号按顺序引⽤的,第⼀个参数的编号是 1。
{?= call <procedure-name>[(<arg1>,<arg2>, ...)]} -------存储函数的sql,第⼀个?代表返回类型{call <procedure-name>[(<arg1>,<arg2>, ...)]} -------存储过程的sqlIN 参数值是使⽤继承⾃的 set ⽅法设置的。
在执⾏存储过程之前,必须注册所有 OUT 参数的类型;它们的值是在执⾏后通过此类提供的 get ⽅法获取的。
CallableStatement 可以返回⼀个对象或多个 ResultSet 对象。
多个 ResultSet 对象是使⽤继承⾃的操作处理的。
为了获得最⼤的可移植性,某⼀调⽤的 ResultSet 对象和更新计数应该在获得输出参数的值之前处理。
例⼦程序对oracle的scott/tiger⽤户的emp表操作存储过程,查询员⼯信息create or replace procedure queryEmpInfo(eno in number,pename out varchar2,psal out number,pjob out varchar2)asbeginselect ename,sal,job into pename,psal,pjob from emp where empno=eno;end;存储函数:create or replace function queryEmpImcome(eno in number)return numberas--变量psal emp.sal%type;pcomm m%type;beginselect sal,comm into psal,pcomm from emp where empno=eno;return (psal+nvl(pcomm,0))*12;end;jdbc⼯具类package com.lhy.util;import java.sql.*;/*** JDBC⼯具类,⼀般⼯具类final。
Java中调用存储过程或存储函数的方法.txt机会就像秃子头上一根毛,你抓住就抓住了,抓不住就没了。
我和你说了10分钟的话,但却没有和你产生任何争论。
那么,我们之间一定有个人变得虚伪无比!过错是短暂的遗憾,错过是永远的遗憾。
相遇是缘,相知是份,相爱是约定,相守才是真爱。
1.调用存储过程:CallableStatement clstmt = null;try {clstmt = conn.prepareCall("{call package_name.procedure_name(?,?,?,?,?)}");clstmt.setString(1, bill.getBillType());clstmt.setString(2, bill.getId());clstmt.setInt(3, bill.getNum());clstmt.registerOutParameter(4, Types.CHAR);clstmt.registerOutParameter(5, Types.VARCHAR);clstmt.execute();out_opresult = clstmt.getString(4).trim();out_operror = clstmt.getString(5).trim();} catch (SQLException e) {System.out.println(e.getMessage());}2.调用存储函数:CallableStatement clstmt = null;try {clstmt = conn.prepareCall("{? = call package_name.function_name(?,?,?,?)}");clstmt.registerOutParameter(1, Types.VARCHAR);clstmt.setString(2, bill.getBillType());clstmt.setString(3, bill.getId());clstmt.registerOutParameter(4, Types.CHAR);clstmt.registerOutParameter(5, Types.VARCHAR);clstmt.execute();out_opresult = clstmt.getString(4).trim();out_operror = clstmt.getString(5).trim();} catch (SQLException e) {System.out.println(e.getMessage());}* 存储过程编写时应注意:1.输出参数不能作为查询条件;eg:假设,out_id已赋值,SELECT nameINTO out_nameFROM tb_testWHERE id = out_id;这样写PL/SQL中会正常通过,而在Java程序调用该存储过程时会报错,需要改成: v_id CHAR(8) := '';先对v_id赋值,SELECT nameINTO out_nameFROM tb_testWHERE id = v_id;这样PL/SQL和Java程序中都可正常通过和调用。
如何在Java程序中调用存储过程(一)?(1)使用scott/tiger用户在Oracle中创建2个表并插入几条数据。
Create table carl_test(A varchar2(200));create table carl_test1(B varchar2(200));--insert some data into carl_test1 tableinsert into carl_test1 values('carl1');insert into carl_test1 values('carl2');insert into carl_test1 values('carl3');commit;(2)使用scott/tiger用户在Oracle中创建一个测试存储过程,该存储过程有三个参数,第一个参数为输入参数,最后两个参数为输出参数。
为简单起见,没有在该存储过程中加入异常捕获机制。
CREATE OR REPLACE PROCEDURE carl_sp_test( v_monthly IN varchar2,last_inserted_rows_num OUT number,all_effected_rows_num OUT number)ISBEGIN/*删除carl_test表中所有记录*/delete carl_test;/*将删除行数赋值给总影响行数*/all_effected_rows_num := SQL%Rowcount;commit;/*将用户输入参数插入carl_test表中*/insert into carl_test(a) values(v_monthly);all_effected_rows_num:= all_effected_rows_num + SQL%Rowcount;/*将表carl_test1中的所有记录插入到carl_test1中*/insert into carl_testselect* from carl_test1;/*获得影响记录数*/last_inserted_rows_num:=SQL%Rowcount;all_effected_rows_num:= all_effected_rows_num + SQL%Rowcount;commit;END carl_sp_test;(3)使用scott/tiger用户在SQL/Plus中测试上述存储过程SQL> variable all_effected_rows_num number;SQL> variable last_inserted_rows_num number;SQL> exec carl_sp_test('first var',:last_inserted_rows_num,:all_effected_rows_num);PL/SQL procedure successfully completedlast_inserted_rows_num---------3all_effected_rows_num---------4SQL> print last_inserted_rows_num;last_inserted_rows_num---------3SQL> print all_effected_rows_num;all_effected_rows_num---------4SQL>上述结果表示测试成功(4)使用下面的Java类TestStoreProcedure.java测试存储过程。
该存储过程有一个输入参数,三个输出参数,其中一个输出参数为游标类型。
在Java代码中调用hibernateDao.executeProcedureOrderByParams()方法调用存储过程。
代码注意:OracleTypes.CURSOR为游标类型,使用时需要在模块中引入package:oracle.jdbc。
输出的结果是{2=34, 3=fsfsfs, 4=[{AGE=34, ID=fsfsfs}, {AGE=35, ID=5675757}, {AGE=36, ID=121221}]}输出参数4是结果集。
返回的Map中的游标结果集为list类型,通过List list = (List)m.get(“4”)将结果集取出。
list为map对象集合。
如返回数组类型参照如下例子Map in=new HashMap();Map out=new HashMap();in.put(1,"fffff");in.put(2,"11");in.put(3,"2013");//out.put(4, OracleTypes.CHAR);//HashMap<String,Map<String,List<String>>>outinfo = new HashMap<String, Map<String,List<String>>>();//Map out = new HashMap();Map type1 = new HashMap();type1.put("type", 2003);type1.put("typeName", "FILENAME_ARRAY");out.put("4", type1);// Map m = hibernateDao.executeProcedure("{call checkRuler(?)}",null,out);//// Map m = hibernateDao.executeProcedureOrderByParams("{call checkRuler(?)}",null,out);//// out.put("2",Types.VARCHAR);Map m =hibernateDao.executeProcedureOrderByParams("{call testsuzhu(?,?,?,?)}",in,out);。
java调用存储过程的三种方式这里为大家谈谈Java存储过程调用,我们可以利用Java存储过程简化数据库操作, 利用Java存储过程沟通SQL、XML、Java、J2EE和Web服务。
创建需要的测试表:create table Test(tid varchar2(10),tname varchar2(10));一:无返回值的存储过程存储过程为:CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) ASBEGININSERT INTO HYQ.B_ID (I_ID,I_NAME) VALUES (PARA1, PARA2);END TESTA;然后呢,在 java 里调用时就用下面的代码:package com.hyq.src;import java.sql.*;import java.sql.ResultSet;public class TestProcedureOne {public TestProcedureOne() {}public static void main(String[] args ){String driver = "oracle.jdbc.driver.OracleDriver";String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521: hyq ";Statement stmt = null;ResultSet rs = null;Connection conn = null;CallableStatement cstmt = null;try {Class.forName(driver);conn = DriverManager.getConnection(strUrl, " hyq ", " hyq "); CallableStatement proc = null;proc = conn.prepareCall("{ call HYQ.TESTA(?,?) }");proc.setString(1, "100");proc.setString(2, "T estOne");proc.execute();}catch (SQLException ex2) {ex2.printStackTrace();}catch (Exception ex2) {ex2.printStackTrace();}finally{try {if(rs != null){rs.close();if(stmt!=null){stmt.close();}if(conn!=null){conn.close();}}}catch (SQLException ex1) {}}}}当然了,这就先要求要建张表TESTTB, 里面两个字段(I_ID ,I_NAME )。
CallableStatement对象为所有的DBMS提供了一种以标准形式调用已储存过程的方法。
已储存过程储存在数据库中。
对已储存过程的调用是CallableStatement对象所含的内容。
这种调用是用一种换码语法来写的,有两种形式:一种形式带结果参,另一种形式不带结果参数。
结果参数是一种输出(OUT)参数,是已储存过程的返回值。
两种形式都可带有数量可变的输入(IN参数)、输出(OUT参数)或输入和输出(INOUT参数)的参数。
问号将用作参数的占位符。
在JDBC中调用已储存过程的语法如下所示。
注意,方括号表示其间的内容是可选项;方括号本身并非语法的组成部份。
{call过程名[(?,?,...)]}返回结果参数的过程的语法为:{?=call过程名[(?,?,...)]}不带参数的已储存过程的语法类似:{call过程名}通常,创建CallableStatement对象的人应当知道所用的DBMS是支持已储存过程的,并且知道这些过程都是些什么。
然而,如果需要检查,多种DatabaseMetaData方法都可以提供这样的信息。
例如,如果DBMS支持已储存过程的调用,则supportsStoredProcedures方法将返回true,而getProcedures方法将返回对已储存过程的描述。
CallableStatement继承Statement的方法(它们用于处理一般的SQL语句),还继承了PreparedStatement的方法(它们用于处理IN参)。
CallableStatement中定义的所有方法都用于处理OUT参数或INOUT参数的输出部分:注册OUT参数的JDBC类型(一般SQL类型)、从这些参数中检索结果,或者检查所返回的值是否为JDBC NULL。
1、创建CallableStatement对象CallableStatement对象是用Connection方法prepareCall创建的。
您还未登录 ! 我的应用 登录 注册论坛首页 → Java 编程和Java 企业应用版 → Java 综合 →JAVA 调用SQL 存储过储过程程详解全部 Hibernate Spring Struts iBATIS 企业应用 设计模式 DAO 领域模型 OO Tomcat SOA JBoss Swing Java 综合浏览 1907 次主题:JAVA 调用SQL 存储过储过程程详解精华帖 (0) :: 良好帖 (1) :: 新手帖 (1) :: 隐藏帖 (2)作者正文lgs0626•等级: ••性别:•1使用不带参数的存储过程 使用 JDBC 驱动程序调用不带参数的存储过程时,必须使用 call SQL 转义序列。
不带参数的 call 转义序列的语法如下所示: {call procedure-name} 作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中创建以下存储过程: SQL code : CREATE PROCEDURE GetContactFormalNames AS BEGIN SELECT TOP 10 Title + ' ' + FirstName + ' ' + LastName AS FormalName FROM Person.Contact END 此存储过程返回单个结果集,其中包含一列数据(由 Person.Contact 表中前十个联系人的称呼、名称和姓氏组成)。
在下面的实例中,将向此函数传递 AdventureWorks 示例数据库的打开连接,然后使用 executeQuery 方法调用 GetContactFormalNames 存储过程。
Java code : 方法一: Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("{call dbo.GetContactFormalNames}");while (rs.next()) {System.out.println(rs.getString("FormalName"));}方法二: CallableStatement callstat = con.prepareCall("{call dbo.GetContactFormalNames}"); ResultSet rs = callstat.executeQuery(); while(rs.next()){ System.out.println(rs.getString(2)); }2使用带有输入参数的存储过程使用 JDBC 驱动程序调用带参数的存储过程时,必须结合 SQLServerConnection 类的 prepareCall 方法使用 call SQL 转义序列。
带有 IN 参数的 call 转义序列的语法如下所示:{call procedure-name[([parameter][,[parameter]]...)]}构造 call 转义序列时,请使用 ?(问号)字符来指定 IN 参数。
此字符充当要传递给该存储过程的参数值的占位符。
可以使用SQLServerPreparedStatement 类的 setter 方法之一为参数指定值。
可使用的 setter 方法由 IN 参数的数据类型决定。
向 setter 方法传递值时,不仅需要指定要在参数中使用的实际值,还必须指定参数在存储过程中的序数位置。
例如,如果存储过程包含单个 IN 参数,则其序数值为 1。
如果存储过程包含两个参数,则第一个序数值为 1,第二个序数值为 2。
作为如何调用包含 IN 参数的存储过程的实例,使用 SQL Server 2005 AdventureWorks 示例数据库中的 uspGetEmployeeManagers 存储过程。
此存储过程接受名为 EmployeeID 的单个输入参数(它是一个整数值),然后基于指定的 EmployeeID 返回雇员及其经理的递归列表。
下面是调用此存储过程的 Java 代码:: jdbc 调用oracle 存储过程注意事项•用easymock 测试jdbc •JDBC 调用存储过程• 推荐圈子: JAVA 3T 更多相关推荐Java code :PreparedStatement pstmt = con.prepareStatement("{call pGetEmployeeManagers(?)}");pstmt.setInt(1, 50);ResultSet rs = pstmt.executeQuery();while (rs.next()) {System.out.println("EMPLOYEE:");System.out.println(rs.getString("LastName") + ", " + rs.getString("FirstName"));System.out.println("MANAGER:");System.out.println(rs.getString("ManagerLastName") + ", " + rs.getString("ManagerFirstName"));System.out.println();}3使用带有输出参数的存储过程使用 JDBC 驱动程序调用此类存储过程时,必须结合 SQLServerConnection 类的 prepareCall 方法使用 call SQL 转义序列。
带有 OUT 参数的 call 转义序列的语法如下所示:{call procedure-name[([parameter][,[parameter]]...)]}构造 call 转义序列时,请使用 ?(问号)字符来指定 OUT 参数。
此字符充当要从该存储过程返回的参数值的占位符。
要为 OUT 参数指定值,必须在运行存储过程前使用 SQLServerCallableStatement 类的 registerOutParameter 方法指定各参数的数据类型。
使用 registerOutParameter 方法为 OUT 参数指定的值必须是 java.sql.Types 所包含的 JDBC 数据类型之一,而它又被映射成本地 SQL Server 数据类型之一。
有关 JDBC 和 SQL Server 数据类型的详细信息,请参阅了解 JDBC 驱动程序数据类型。
当您对于 OUT 参数向 registerOutParameter 方法传递一个值时,不仅必须指定要用于此参数的数据类型,而且必须在存储过程中指定此参数的序号位置或此参数的名称。
例如,如果存储过程包含单个 OUT 参数,则其序数值为 1;如果存储过程包含两个参数,则第一个序数值为 1,第二个序数值为 2。
作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中创建以下存储过程:根据指定的整数 IN 参数 (employeeID),该存储过程也返回单个整数 OUT 参数 (managerID)。
根据 HumanResources.Employee 表中包含的 EmployeeID,OUT 参数中返回的值为 ManagerID。
在下面的实例中,将向此函数传递 AdventureWorks 示例数据库的打开连接,然后使用 execute 方法调用 GetImmediateManager 存储过程:Java code :CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}");cstmt.setInt(1, 5);cstmt.registerOutParameter(2, java.sql.Types.INTEGER);cstmt.execute();System.out.println("MANAGER ID: " + cstmt.getInt(2));本示例使用序号位置来标识参数。
或者,也可以使用参数的名称(而非其序号位置)来标识此参数。
下面的代码示例修改了上一个示例,以说明如何在 Java 应用程序中使用命名参数。
请注意,这些参数名称对应于存储过程的定义中的参数名称:SQL code :CREATE PROCEDURE GetImmediateManager@employeeID INT,@managerID INT OUTPUTASBEGINSELECT @managerID = ManagerIDFROM HumanResources.EmployeeWHERE EmployeeID = @employeeIDEND存储过程可能返回更新计数和多个结果集。
Microsoft SQL Server 2005 JDBC Driver 遵循 JDBC 3.0 规范,此规范规定在检索 OUT 参数之前应检索多个结果集和更新计数。
也就是说,应用程序应先检索所有 ResultSet 对象和更新计数,然后使用 CallableStatement.getter 方法检索 OUT 参数。
否则,当检索 OUT 参数时,尚未检索的 ResultSet 对象和更新计数将丢失。
4 使用带有返回状态的存储过程使用 JDBC 驱动程序调用这种存储过程时,必须结合 SQLServerConnection 类的 prepareCall 方法使用 call SQL 转义序列。
返回状态参数的 call 转义序列的语法如下所示:{[?=]call procedure-name[([parameter][,[parameter]]...)]}构造 call 转义序列时,请使用 ?(问号)字符来指定返回状态参数。
此字符充当要从该存储过程返回的参数值的占位符。
要为返回状态参数指定值,必须在执行存储过程前使用 SQLServerCallableStatement 类的 registerOutParameter 方法指定参数的数据类型。
此外,向 registerOutParameter 方法传递返回状态参数值时,不仅需要指定要使用的参数的数据类型,还必须指定参数在存储过程中的序数位置。