CallableStatement调用Oracle存储过程返回结果集(ResultSet)

合集下载

Oracle中返回结果集的存储过程分享

Oracle中返回结果集的存储过程分享

Oracle中返回结果集的存储过程分享Oracle不像SQLServer那样在存储过程中⽤Select就可以返回结果集,⽽是通过Out型的参数进⾏结果集返回的。

实际上是利⽤REF CURSOR复制代码代码如下:--procedure返回记录集:----------------------声明⼀个Package--------------CREATE OR REPLACE PACKAGE pkg_testASTYPEmyrctypeIS REF CURSOR;PROCEDURE get_r(p_id NUMBER,p_rc OUT myrctype); --Package中声明名为get 的Procedure(只有接⼝没内容)END pkg_test;-----------------声明Package Body,即上⾯Package中的内容,包括Procedure get---------------------CREATE OR REPLACE PACKAGE BODY pkg_testASPROCEDURE get_r(p_id NUMBER,p_rc OUT myrctype)ISsqlstr VARCHAR2 (500);BEGINIF p_id = 0 THENOPEN p_rc FORSELECT ID, NAME, sex, address, postcode, birthdayFROM student;ELSEsqlstr :='select id,name,sex,address,postcode,birthdayfrom student where id=:w_id'; --w_id是个参数,--以下 p_rc是个REF CURSOR游标类型,⽽且是OUT型参数,即可返回⼀个记录集了。

USING p_id就是替换上⾯SQL中:w_id值拉:)OPEN p_rc FOR sqlstr USING p_id; END IF;END get;END pkg_test;--function返回记录集的例⼦,原理和上⾯相同,⽽是⽤function的return值来返回记录集。

callablestatement参数解析

callablestatement参数解析

callablestatement参数解析关于CallableStatement参数解析CallableStatement是Java JDBC API中的一种特殊的PreparedStatement,用于执行存储过程或函数。

与PreparedStatement 相比,CallableStatement允许开发人员执行更复杂的数据库操作。

在本文中,我们将逐步回答关于CallableStatement参数的解析问题,以帮助读者了解如何使用CallableStatement来执行存储过程或函数。

第一步:创建CallableStatement对象要使用CallableStatement,我们首先需要获取一个Connection对象,然后使用该Connection对象的prepareCall()方法来创建一个CallableStatement对象。

prepareCall()方法需要一个String类型的参数,用于指定要执行的存储过程或函数的SQL语句。

例如:String sql = "{call my_stored_procedure(?, ?)}"; CallableStatement callableStatement =connection.prepareCall(sql);在上面的代码中,String参数"sql"指定了要执行的存储过程或函数的SQL 语句,其中"?"是占位符,表示存储过程或函数的参数。

我们将在后面的步骤中解析这些参数。

第二步:设置存储过程或函数的输入参数一旦创建了CallableStatement对象,我们可以使用setXxx()系列方法设置存储过程或函数的输入参数(即IN参数)。

setXxx()方法的两个参数分别是参数的位置和参数的值。

参数位置是从1开始的整数,表示参数在存储过程或函数中的顺序。

参数的值可以是任何Java基本类型或Java对象类型。

java通过调用存储过程获取结果集

java通过调用存储过程获取结果集

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。

Spring jdbcTemplate调用Oracle存储过程返回List集合

Spring jdbcTemplate调用Oracle存储过程返回List集合

jdbcTemplate调用Oracle存储过程返回List集合作者:xyzc(cr10210206@)1.编写存储过程-- 模糊查询返回多条数据CREATE OR REPLACE PROCEDURE P_EMP_SELECT(RESULTLIST OUT SYS_REFCURSOR,V_ID IN NUMBER,V_NAME IN VARCHAR2)ISSQL_STR VARCHAR2(500);BEGINSQL_STR:='SELECT * FROM EMP WHERE 1=1 ';DBMS_OUTPUT.put_line('V_ID='||V_ID ||' V_NAME='||V_NAME);IF(V_ID<>0)THENBEGINSQL_STR:=SQL_STR ||' AND EMPNO>= '|| V_ID;END;END IF;IF(V_NAME IS NOT NULL)THEN-- 判断字符串是否为空BEGINSQL_STR:=SQL_STR ||' AND ENAME LIKE '''||V_NAME ||'%'' ';-- 字符串是四个单引号 ''A%'' END;END IF;DBMS_OUTPUT.put_line(' SQL_STR:'||SQL_STR);-- 输出SQL语句OPEN RESULTLIST FOR SQL_STR;END;-- 测试DECLAREMYCRS SYS_REFCURSOR;-- 注意这里用分号;V_EMP EMP%ROWTYPE;BEGIN-- 调用过程,返回的是已经打开的CURSORP_EMP_SELECT(MYCRS,7900,'');LOOPFETCH MYCRS INTO V_EMP;EXIT WHEN MYCRS%NOTFOUND;DBMS_OUTPUT.put_line(V_EMP.EMPNO||' '||V_EMP.ENAME);END LOOP;CLOSE MYCRS;END;2.编写Java代码package com.zc.test;import java.sql.CallableStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import oracle.jdbc.driver.OracleTypes;import org.springframework.dao.DataAccessException;import org.springframework.jdbc.core.CallableStatementCallback; import org.springframework.jdbc.core.JdbcTemplate;/*** 测试Oracle存储过程* */public class TestOraclePro {private static JdbcTemplate jdbcTemplate= TestDao.getJdbcTemplateOracle();/*** 测试* */public static void main(String[] args) {TestOraclePro test = new TestOraclePro();List<HashMap<String, Object>> result = test.testPro();System.out.println("\nresult:\n" + result);/*** 返回的结果:** [{DEPTNO=20, COMM=null, HIREDATE=1980-12-17 00:00:00.0, MGR=7902, SAL=800, JOB=CLERK, ENAME=SMITH, EMPNO=7369},* {DEPTNO=30, COMM=300, HIREDATE=1981-02-20 00:00:00.0, MGR=7698, SAL=1600, JOB=SALESMAN, ENAME=ALLEN, EMPNO=7499}, * {DEPTNO=30, COMM=500, HIREDATE=1981-02-22 00:00:00.0, MGR=7698, SAL=1250, JOB=SALESMAN, ENAME=WARD, EMPNO=7521},* {DEPTNO=20, COMM=null, HIREDATE=1981-04-02 00:00:00.0,MGR=7839, SAL=2975, JOB=MANAGER, ENAME=JONES, EMPNO=7566},* {DEPTNO=30, COMM=1400, HIREDATE=1981-09-28 00:00:00.0, MGR=7698, SAL=1250, JOB=SALESMAN, ENAME=MARTIN, EMPNO=7654}, * {DEPTNO=30, COMM=null, HIREDATE=1981-05-01 00:00:00.0, MGR=7839, SAL=2850, JOB=MANAGER, ENAME=BLAKE, EMPNO=7698},* {DEPTNO=10, COMM=null, HIREDATE=1981-06-09 00:00:00.0, MGR=7839, SAL=2450, JOB=MANAGER, ENAME=CLARK, EMPNO=7782},* {DEPTNO=20, COMM=null, HIREDATE=1987-04-19 00:00:00.0, MGR=7566, SAL=3000, JOB=ANALYST, ENAME=SCOTT, EMPNO=7788},* {DEPTNO=10, COMM=null, HIREDATE=1981-11-17 00:00:00.0, MGR=null, SAL=5000, JOB=PRESIDENT, ENAME=KING, EMPNO=7839}, * {DEPTNO=30, COMM=0, HIREDATE=1981-09-08 00:00:00.0, MGR=7698, SAL=1500, JOB=SALESMAN, ENAME=TURNER, EMPNO=7844}, * {DEPTNO=20, COMM=null, HIREDATE=1987-05-23 00:00:00.0, MGR=7788, SAL=1100, JOB=CLERK, ENAME=ADAMS, EMPNO=7876},* {DEPTNO=30, COMM=null, HIREDATE=1981-12-03 00:00:00.0, MGR=7698, SAL=950, JOB=CLERK, ENAME=JAMES, EMPNO=7900},* {DEPTNO=20, COMM=null, HIREDATE=1981-12-03 00:00:00.0, MGR=7566, SAL=3000, JOB=ANALYST, ENAME=FORD, EMPNO=7902},* {DEPTNO=10, COMM=null, HIREDATE=1982-01-23 00:00:00.0, MGR=7782, SAL=1300, JOB=CLERK, ENAME=MILLER, EMPNO=7934}]* */}/*** 调用存储过程返回 List<HashMap<String, Object>>* */@SuppressWarnings({ "unchecked", "rawtypes" })public List<HashMap<String, Object>> testPro(){final String sql = "{call P_EMP_SELECT(?,?,?)}";List<HashMap<String, Object>> result = (List<HashMap<String, Object>>) jdbcTemplate.execute(sql,new CallableStatementCallback(){ public Object doInCallableStatement(CallableStatement cs) throws SQLException,DataAccessException {List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();cs.registerOutParameter(1, OracleTypes.CURSOR); //输出参数:游标cs.setInt(2, 2000);//输入参数cs.setString(3, "");//输入参数cs.execute();//执行ResultSet rs = null;try {rs = (ResultSet) cs.getObject(1);//获取结果集while (rs.next()) {HashMap<String, Object> dataMap = new HashMap<String, Object>();ResultSetMetaData rsMataData = rs.getMetaData();for(int i = 1; i <= rsMataData.getColumnCount(); i++) {dataMap.put(rsMataData.getColumnName(i),rs.getString(rsMataData.getColumnName(i)));}list.add(dataMap);}} catch (Exception e) {e.printStackTrace();}finally{if(rs != null){rs.close();}}return list;}});return result;}}。

callablestatement oracle存储过程out参数调用

callablestatement oracle存储过程out参数调用

在Oracle中,存储过程可以有IN、OUT或IN OUT参数。

OUT 参数用于向存储过程提供输出值,这些值可以在存储过程执行后被检索。

以下是如何使用CallableStatement在Java中调用Oracle存储过程并处理OUT参数的示例:假设我们有一个Oracle存储过程,如下所示:```sqlCREATE OR REPLACE PROCEDURE get_employee_count(p_emp_count OUT NUMBER) ASBEGINSELECT COUNT(*) INTO p_emp_count FROM employees;END get_employee_count;/```现在,我们将使用Java的CallableStatement来调用此存储过程并检索输出参数的值。

```javaimport java.sql.*;public class OracleCallableStatementExample {public static void main(String[] args) {String url = "jdbc:oracle:thin:@localhost:1521:xe";String user = "username";String password = "password";try {Connection conn = DriverManager.getConnection(url, user, password);CallableStatement cstmt = conn.prepareCall("{call get_employee_count(?)}");cstmt.registerOutParameter(1,Types.INTEGER); // 注册OUT参数cstmt.execute(); // 执行存储过程int empCount = cstmt.getInt(1); // 获取OUT 参数的值System.out.println("Employee count: " + empCount);cstmt.close();conn.close();} catch (SQLException ex) {ex.printStackTrace();}}}```请注意,我们使用`registerOutParameter`方法来注册OUT参数,并使用`getInt`方法来检索OUT参数的值。

java oracle存储过程写法及调用

java oracle存储过程写法及调用

java oracle存储过程写法及调用Java中调用和编写Oracle存储过程是非常常见的操作,可以利用存储过程来执行数据库操作,提高数据库的性能和安全性。

本文将为您详细介绍Java中调用和编写Oracle存储过程的方法和步骤。

一、什么是Oracle存储过程?Oracle存储过程是一段预定义在数据库中的PL/SQL代码,可以像函数一样接收参数和返回值,用于完成特定的数据库操作。

存储过程可以包含SQL语句、逻辑控制语句、流程控制语句等,可以完成复杂的业务逻辑和数据库操作。

二、Java中调用Oracle存储过程的步骤1. 导入相关的JDBC驱动在Java中调用Oracle存储过程之前,首先需要导入相关的JDBC驱动。

可以从Oracle官网下载相应版本的JDBC驱动,将其添加到Java项目的classpath中。

2. 建立数据库连接使用JDBC的Connection对象与数据库建立连接。

可以使用如下代码建立连接:String url = "jdbc:oracle:thin:localhost:1521:orcl";String username = "username";String password = "password";Connection conn = DriverManager.getConnection(url, username, password);需要将url、username和password替换为实际的数据库连接信息。

3. 创建CallableStatement对象使用Connection对象的prepareCall方法创建CallableStatement对象,该对象用于执行存储过程的调用。

String sql = "{call 存储过程名称(?, ?)}";CallableStatement cstmt = conn.prepareCall(sql);需要将存储过程名称替换为实际的存储过程名称。

java调用存储过程后处理数据的方法

java调用存储过程后处理数据的方法

java调用存储过程后处理数据的方法
在Java中调用存储过程后,我们需要对返回的数据进行处理。

以下是一些处理数据的方法:
1. 使用ResultSet对象来获取存储过程返回的结果集。

可以使用ResultSet的getXXX()方法来获取不同类型的数据。

2. 使用CallableStatement对象来调用存储过程,并使用其方法registerOutParameter()来注册输出参数的类型。

然后可以使用getXXX()方法来获取输出参数的值。

3. 使用ORM框架,如Hibernate或MyBatis,可以将存储过程映射为一个Java方法,并使用返回值或输出参数来获取数据。

4. 使用JdbcTemplate(Spring框架中的一个类),可以方便地调用存储过程并获取结果集或输出参数的值。

5. 使用Java8中的Streams API,可以对ResultSet对象进行流式处理,例如使用stream()方法将ResultSet转换为流,然后使用map()、filter()、reduce()等方法来处理数据。

总之,在Java中调用存储过程后,我们有多种处理数据的方式。

我们可以根据具体情况选择最合适的方法。

- 1 -。

java 调用 oracle 存储过程 返回 结果集 ,Record ,cursor .

java 调用 oracle 存储过程 返回 结果集 ,Record ,cursor .

Java调用oracle 存储过程返回结果集(record)首先创建2个type类型, ,我可以把record记录集里的内容赋给type对象类型,在给游标返回!假如环境是在scott/tiger用户下创建type定义你要返回的字段!drop type myScalarType;drop type myTableType;create or replace type myScalarType as object (rno number(18),rname number(18),rsal number(18));create or replace type myTableType as table of myScalarType;创建PACKAGECREATE OR REPLACE PACKAGE TESTPACKAGE AStype type_cursor is ref cursor;end TESTPACKAGE;创建PROCEDURECREATE OR REPLACE PROCEDURE test_items(MyTable outTESTPACKAGE.type_cursor)ISBEGINDeclareType RecType Is Record(rno number(18),rname number(18),rsal number(18));Type TabType Is Table Of RecType Index By Binary_Integer;MyTab TabType;obj_type_tab MYTABLETYPE := MYTABLETYPE();vN Number;Begin--填充你要组装的字段vN := 1;MyTab(vN).rno := '00000';MyTab(vN).rname := '11111';MyTab(vN).rsal := '22222';vN := vN + 1;MyTab(vN).rno := '33333';MyTab(vN).rname := '44444';MyTab(vN).rsal := '55555';vN := MyTab.First;For varR In vN..MyTab.countLoopobj_type_tab.EXTEND;obj_type_tab(obj_type_ST) := myscalartype(MyTab(vN).rno, MyTab(vN).rname,MyTab(vN).rsal);DBMS_OUTPUT.PUT_LINE(vN ||'--'||MyTab(vN).rno||'--'||MyTab(vN).rname||'--'||MyTab(vN).rsal);vN := MyTab.Next(vN);End Loop; --*/open MyTable for select rno ,rname,rsal from table(cast(obj_type_tab AS MYTABLETYPE));End;dbms_output.PUT_LINE('-dayi--');END test_items;Java 代码package test.samo.owner;import java.sql.*;import java.sql.ResultSet;import oracle.jdbc.driver.*;public class TestProcedureTHREE {/*** @param args*/public static void main(String[] args) {String driver="oracle.jdbc.driver.OracleDriver";String strUrl="jdbc:oracle:thin:@192.168.1.1:1521:orcl";Statement stmt=null;ResultSet rs=null;Connection conn=null;try{Class.forName(driver);conn = DriverManager.getConnection(strUrl, "admin", "123456");CallableStatement proc = null;proc = conn.prepareCall("{ call test_items(?) }");proc.registerOutParameter(1,/*oracle.jdbc.*/OracleTypes.CURSOR);proc.execute();rs = (ResultSet)proc.getObject(1);System.out.println("输出结果:");while(rs.next()){System.out.println(" " + rs.getString(1) + ""+rs.getString(2)+" "+rs.getString(3));}}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) {}}}}打印结果输出结果:0 11111 2222233333 44444 55555。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java(CallableStatement)调用Oracle存储过程返回结果集(ResultSet) 一:无返回值的存储过程调用存储过程:CREATE OR REPLACE PROCEDURE PRO_1(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) ASBEGININSERT INTO DBO.EMP (ID,NAME) VALUES (PARA1, PARA2);END PRO_1;Java代码:package com.icesoft.service;import java.sql.*;import java.sql.ResultSet;public class CallProcedureTest1 {public CallProcedureTest1() {super();}public static void main(String[] args) {String driver = "oracle.jdbc.driver.OracleDriver";String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl ";String user = "admin";String pwd = "password";Connection conn = null;CallableStatement cs = null;ResultSet rs = null;try {Class.forName(driver);conn = DriverManager.getConnection(url, user, pwd);cs = conn.prepareCall("{ call DBO.PRO_1(?,?) }");cs.setString(1, "10");cs.setString(2, "Peter");cs.execute();} catch (SQLException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();} finally {try {if (rs != null) {rs.close();}if (cs != null) {cs.close();}if (conn != null) {conn.close();}} catch (SQLException e) {}}}}备注,存储过程PRO_1中用到了表EMP(ID, NAME),需事先建好二:有返回值的存储过程(非结果集)存储过程:CREATE OR REPLACE PROCEDURE PRO_2(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2) ASBEGINSELECT INTO PARA2 FROM EMP WHERE ID= PARA1;END PRO_2;Java代码:package com.icesoft.service;import java.sql.*;public class CallProcedureTest2 {public CallProcedureTest2() {super();}public static void main(String[] args) {String driver = "oracle.jdbc.driver.OracleDriver";String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl"; String user = "admin";String pwd = "password";Connection conn = null;CallableStatement cs = null;ResultSet rs = null;try {Class.forName(driver);conn = DriverManager.getConnection(url, user, pwd); cs = conn.prepareCall("{ call DBO.PRO_2(?,?) }");cs.setString(1, "10");cs.registerOutParameter(2, Types.VARCHAR);cs.execute();String name = cs.getString(2);System.out.println("name: " + name);} catch (SQLException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();} finally {try {if (rs != null) {rs.close();}if (cs != null) {cs.close();}if (conn != null) {conn.close();}} catch (SQLException e) {}}}}注意:cs.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。

三:返回列表由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage 了.所以要分两部分,1. 建一个程序包。

如下:CREATE OR REPLACE PACKAGE MYPACKAGE ASTYPE MY_CURSOR IS REF CURSOR;end MYPACKAGE;2. 建立存储过程,如下:CREATE OR REPLACE PROCEDURE PRO_3(p_CURSOR out MYPACKAGE.MY_CURSOR) ISBEGINOPEN p_CURSOR FOR SELECT * FROM DBO.EMP;END PRO_3;可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。

Java代码:package com.icesoft.service;import java.sql.*;import java.sql.ResultSet;public class CallProcedureTest2 {public CallProcedureTest2() {super();}public static void main(String[] args) {String driver = "oracle.jdbc.driver.OracleDriver";String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";String user = "admin";String pwd = "password";Connection conn = null;CallableStatement cs = null;ResultSet rs = null;try {Class.forName(driver);conn = DriverManager.getConnection(url, user, pwd);cs = conn.prepareCall("{ call DBO.PRO_3(?) }");cs.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR); cs.execute();rs = (ResultSet) cs.getObject(1);while (rs.next()) {System.out.println("\t" + rs.getString(1) + "\t"+ rs.getString(2) + "\t");}} catch (SQLException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();} finally {try {if (rs != null) {rs.close();if (cs != null) {cs.close();}if (conn != null) {conn.close();}}} catch (SQLException e) {}}}}注意:在执行前一定要先把oracle的驱动包放到class路径里,否则会报错。

另外的例子:// CallableStatement 1 - 调用一个含有out参数的procedureCallableStatement cs=conn.prepareCall("{call mytestprc10(?,?,?)}");cs.setString(1,"10");cs.setString(2,"20");cs.registerOutParameter(3,Types.INTEGER);//注意此处对返回参数的设置方法cs.executeUpdate();int t=cs.getInt(3);System.out.println("CallableStatement 1 :"+t);cs.close();//CallableStatement 2 - 调用一个返回数值型参数的函数CallableStatement cs2=conn.prepareCall("{?=call mytestpkg1.myf_mult(?,?)}");cs2.registerOutParameter(1,Types.INTEGER);//注意此处对返回参数的设置方法cs2.setInt(2,2);cs2.setInt(3,3);cs2.executeUpdate();int t2=cs2.getInt(1);System.out.println("CallableStatement 2 : " + t2);cs2.close();//CallableStatement 3 - 调用一个返回Cursor类型参数的函数CallableStatement cs3=conn.prepareCall("{?=call mytestpkg1.myf_rtnrcd(?)}");cs3.registerOutParameter(1, OracleTypes.CURSOR);//注意此处对返回参数的设置方法,和上面的有所不同cs3.setInt(2,20);cs3.executeUpdate();ResultSet rs3=(ResultSet)cs3.getObject(1);rs3.next();System.out.println("CallableStatement 3 : " + rs3.getString(2));rs3.close();cs3.close();。

相关文档
最新文档