如何在Java程序中调用存储过程
- 格式:doc
- 大小:44.50 KB
- 文档页数:4
JAVA调用ORACLE存储过程小结在Java中调用Oracle存储过程可以使用JDBC(Java Database Connectivity)技术。
JDBC是一种用于执行SQL语句和数据库操作的API。
在本文中,我们将讨论如何在Java中调用Oracle存储过程。
在调用Oracle存储过程之前,我们需要创建一个连接到数据库的JDBC连接。
这可以通过以下步骤完成:2. 创建数据库连接:使用JDBC驱动程序创建一个Connection对象来与数据库建立连接。
需要提供数据库的URL,用户名和密码。
例如:```String username = "your_username";String password = "your_password";Connection connection = DriverManager.getConnection(url, username, password);```这里的URL是连接到Oracle数据库的URL。
localhost表示连接的是本地主机,1521是Oracle数据库的默认端口,xe是Oracle Express Edition的默认数据库实例。
3. 调用存储过程:通过创建一个CallableStatement对象来调用存储过程。
首先,我们需要构造一个SQL语句,其中包含对存储过程的调用。
假设我们要调用一个名为`get_employee`的存储过程,它接受一个员工ID作为参数,并返回该员工的姓名和薪水。
在Java代码中,可以这样调用存储过程:```String sql = "{call get_employee(?,?,?)}";CallableStatement statement = connection.prepareCall(sql);```这里的`?`是占位符,表示存储过程的参数。
通过调用`connection.prepareCall(`方法,可以创建一个CallableStatement对象,并将SQL语句作为参数传递给它。
存储过程调用java代码的方法存储过程是一组SQL语句的集合,可以被视为一种预编译的SQL 语句,可以通过存储过程调用来实现对数据库的操作。
在Java中,我们可以通过以下方法来调用存储过程:1. 使用JDBC调用存储过程使用JDBC调用存储过程需要以下步骤:1)获取数据库连接。
2)创建CallableStatement对象,使用存储过程名称作为参数创建对象。
3)设置输入参数和输出参数。
输入参数可以通过setXXX()方法设置,输出参数可以使用registerOutParameter()方法注册。
4)执行存储过程。
可以使用execute()或executeUpdate()方法执行。
5)获取输出参数。
以下是一个简单的示例:```try(Connection conn = DriverManager.getConnection(url, user, password)) {CallableStatement cs = conn.prepareCall('{call procedure_name(?, ?)}');cs.setInt(1, 1); // 设置输入参数cs.registerOutParameter(2, Types.VARCHAR); // 注册输出参数cs.execute(); // 执行存储过程String result = cs.getString(2); // 获取输出参数System.out.println(result);} catch (SQLException e) {e.printStackTrace();}```2. 使用ORM框架调用存储过程使用ORM框架调用存储过程需要根据不同的框架进行配置。
以下是使用MyBatis调用存储过程的示例:1)在Mapper XML文件中定义存储过程调用语句。
```<select id='callProcedure' statementType='CALLABLE'>{call procedure_name(#{param1, mode=IN,jdbcType=INTEGER}, #{param2, mode=OUT, jdbcType=VARCHAR})}</select>```2)在Java代码中调用Mapper方法。
jdbc 调用存储过程
JDBC调用存储过程是Java程序员经常会用到的技能。
存储过程是一种存储在数据库中的预定义程序,可以让我们像执行 SQL 语句一样调用它。
在 Java 中,我们可以使用 JDBC API 来调用存储过程。
调用存储过程需要以下步骤:
1.连接到数据库
连接到数据库需要使用 JDBC 的 DriverManager 类来获取数据库连接。
在获取连接之前,需要知道数据库的 URL、用户名和密码。
2.创建 CallableStatement
在获取到连接之后,可以使用 Connection 接口的 prepareCall 方法创建一个 CallableStatement 对象。
这个对象用来调用存储过程。
3.设置参数
在创建 CallableStatement 对象之后,可以使用 set 方法设置存储过程的参数。
存储过程的参数可以是输入参数、输出参数或输入输出参数。
4.执行存储过程
设置完参数之后,可以使用 CallableStatement 对象的execute 方法来执行存储过程。
5.获取结果
存储过程执行完毕后,可以使用 get 方法获取输出参数的值。
以上就是调用存储过程的基本步骤。
需要注意的是,不同的数据
库对存储过程的支持不一样,需要根据不同数据库的文档来了解具体支持情况。
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程序中调用存储过程(一)?(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 )。
java调用sql函数_java调用数据库中的函数和存储过程Java是一种常用的编程语言,用于开发各种类型的应用程序,包括与数据库进行交互的应用程序。
在Java程序中,我们可以使用JDBC(Java Database Connectivity)技术来连接和操作数据库。
通过JDBC,我们可以调用数据库中的函数和存储过程来执行一些特定的任务。
在Java中调用SQL函数和存储过程的基本步骤如下:2. 建立数据库连接:使用JDBC连接字符串、用户名和密码等相关参数来创建与数据库的连接。
JDBC提供了一个名为Connection的接口来表示与数据库的连接。
可以使用DriverManager类的静态方法getConnection来获取数据库连接对象。
```javaString username = "用户名";String password = "密码";Connection connection = DriverManager.getConnection(url, username, password);```3. 创建CallableStatement对象:CallableStatement是一个表示可以执行存储过程或函数的SQL语句的接口。
使用Connection对象的prepareCall方法创建一个CallableStatement对象。
```javaString sql = "{call 存储过程或函数名称(参数1, 参数2, ...)}";CallableStatement statement = connection.prepareCall(sql);```4. 设置参数:如果存储过程或函数需要输入参数,可以使用setXXX 方法设置参数的值。
XXX表示参数的数据类型,例如setInt、setString 等。
参数索引从1开始。
```javastatement.setString(1, "参数值");```5. 执行SQL语句:使用execute方法执行存储过程或函数。
Java 调用存储过程PL/SQL子程序,很多情况下是给应用程序来调用的,所有我们要掌握使用其他编程语言来调用我们写好的存储过程。
下面我们介绍下使用java调用Oracle的存储过程。
1.配置调用类package com.mscncn.plsql.util;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;public class DBUtil {static{try {Class.forName("oracle.jdbc.OracleDriver");} catch (ClassNotFoundException e) {e.printStackTrace();}}public static Connection getConntection(){Connection ct=null;try {ct = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.25:1521:oracle","scott","scott");} catch (SQLException e) {e.printStackTrace();}return ct;}}2.编写存储过程create or replace package pro_pk istype pager_cursor is ref cursor;procedure add_dept(dept_no in number,dept_name in varchar2,location in varchar2);procedure delete_dept(dept_no in number,num out number);end pro_pk;create or replace package body pro_pk isprocedure add_dept(dept_no in number,dept_name in varchar2,location in varchar2)isexp_remaining exception;pragma exception_init(exp_remaining,-1);/*非预定义错误,-1是违反唯一约束*/ begininsert into dept values(dept_no,dept_name,location);if sql%found then /*隐式游标,sql*/return 1;elsereturn 0;end if;exceptionwhen exp_remaining thendbms_output.put_line('违反唯一约束.');end add_dept;procedure delete_dept(dept_no in number,num out number)isbegindelete from dept where deptno=dept_no;if sql%found thennum:=1;elsenum:=1;end if;end delete_dept;end pro_pk;create or replace package pageUtil istype page_cursor is ref cursor;--定义一个游标类型procedure pager(tName in varchar2, --表名pageNum in number, --页数pageSize in number,--每页记录数totalRecord out number,--总记录数totalPage out number,--总页数p_cursor out page_cursor);end pageUtil;create or replace package body pageUtil isprocedure pager(tName in varchar2, --表名pageNum in number, --页数pageSize in number,--每页记录数totalRecord out number,--总记录数totalPage out number,--总页数p_cursor out page_cursor) is--定义sql语句字符串v_sql varchar2(1000);--分页开始位置,与结束位置v_begin number:=(pageNum-1)*pageSize+1;v_end number:=pageNum*pageSize;beginv_sql:='select * from ( select t.*,rownum rn from '||tName||' t where rownum<='||v_end||') where rn>='||v_begin;--把游标和sql关联dbms_output.put_line(v_sql);open p_cursor for v_sql;--计算totalRecord与totalPagev_sql:='select count(*) from '||tName;--execute immediate v_sql into totalRecord;if mod(totalRecord,pageSize)=0 thentotalPage:=totalRecord/pageSize;elsetotalPage:=totalRecord/pageSize+1;end if;--关闭游标,这儿需要注意,如果我们在java程序中使用cursor,那么就一定不能关闭cursor--否则关闭cursor后,java程序中返回的结果集就是null--close p_cursor;end pager;end pageUtil;3.调用存储过程1)调用没有返回值的存储过程/*** java调用没有返回值的存储过程*/@Testpublic void proNoReulstTest(){Connection ct=DBUtil.getConntection();try {CallableStatement cs=ct.prepareCall("{call pro_pk.add_dept(?,?,?)}");cs.setInt(1, 13);cs.setString(2, "java开发部");cs.setString(3, "中国信阳");cs.execute();} catch (SQLException e) {e.printStackTrace();}finally{try {ct.close();} catch (SQLException e) {e.printStackTrace();}}}2)调用有返回值的存储过程/*** java调用有返回值的存储过程(返回值类型为number)*/@Testpublic void proHasReulstTest(){Connection ct=DBUtil.getConntection();try {CallableStatement cs=ct.prepareCall("{call pro_pk.delete_dept(?,?)}");cs.setInt(1, 13);//注册第二个参数为存储过程的返回值cs.registerOutParameter(2, OracleType.STYLE_INT);cs.execute();//通过参数的索引,来获取存储过程的返回值,索引从1开始int num=cs.getInt(2);System.out.println(num==1?"删除成功":"删除失败");} catch (SQLException e) {e.printStackTrace();}finally{try {ct.close();} catch (SQLException e) {e.printStackTrace();}}}3)java程序调用存储过程返回值为游标/*** 存储过程返回一个游标*/@Testpublic void proReturnCursorTest(){Connection ct=DBUtil.getConntection();try {CallableStatement cs=ct.prepareCall("{call pageUtil.pager(?,?,?,?,?,?)}");cs.setString(1, "emp");cs.setInt(2, 2);cs.setInt(3, 5);cs.registerOutParameter(4, OracleTypes.NUMBER);cs.registerOutParameter(5, OracleTypes.NUMBER);cs.registerOutParameter(6, OracleTypes.CURSOR);cs.execute();//通过参数的索引,来获取存储过程的返回值,索引从1开始int totalRecord=cs.getInt(4);int totalPage=cs.getInt(5);ResultSet rs=(ResultSet)cs.getObject(6);System.out.println("总记录数为:"+totalRecord+",总页数为:"+totalPage);while(rs.next()){System.out.println("雇员编号:"+rs.getInt("empno")+",雇员姓名:"+rs.getString("ename"));}} catch (SQLException e) {e.printStackTrace();}finally{try {ct.close();} catch (SQLException e) {e.printStackTrace();}} }。
Java代码调⽤存储过程和存储⽅法准备⼀个oracle 的JDBC jar 包:ojdbc14_11g.jar⾸先找到你的 oracle 安装位置,例如:1.创建⼀个JDBC数据库连接⼯具类:[java]1. package com.test.db;2.3. import java.sql.Connection;4. import java.sql.DriverManager;5. import java.sql.ResultSet;6. import java.sql.SQLException;7. import java.sql.Statement;8.9. public class JDBCUtils {10.11. private static String driver = "oracle.jdbc.OracleDriver";12. private static String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";13. private static String user = "数据库连接名";14. private static String password = "数据库连接密码";15.16. //注册数据库驱动17. static{18. try {19. Class.forName(driver);20. } catch (Exception e) {21. throw new ExceptionInInitializerError(e);22. }23. }24.25. /**26. * 获取数据库连接27. * @return28. */29. public static Connection getConnection(){30. try {31. return DriverManager.getConnection(url,user,password);32. } catch (SQLException e) {33. e.printStackTrace();34. }35. return null;36. }37.38. /**39. * 释放数据库连接资源40. * @param conn41. * @param st42. * @param rs43. */44. public static void release(Connection conn,Statement st,ResultSet rs){45. if (rs!=null) {46. try {47. rs.close();48. } catch (SQLException e) {49. e.printStackTrace();50. }finally{51. rs = null;52. }53. }54.55. if (st!=null) {56. try {57. st.close();58. } catch (SQLException e) {59. e.printStackTrace();60. }finally{61. st = null;62. }63. }64.65. if (conn!=null) {66. try {67. conn.close();68. } catch (SQLException e) {69. e.printStackTrace();70. }finally{71. conn = null;72. }73. }74. }75. }package com.test.db;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class JDBCUtils {private static String driver = "oracle.jdbc.OracleDriver";private static String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";private static String user = "数据库连接名";private static String password = "数据库连接密码";//注册数据库驱动static{try {Class.forName(driver);} catch (Exception e) {throw new ExceptionInInitializerError(e);}}/*** 获取数据库连接* @return*/public static Connection getConnection(){try {return DriverManager.getConnection(url,user,password);} catch (SQLException e) {e.printStackTrace();}return null;}/*** 释放数据库连接资源* @param conn* @param st* @param rs*/public static void release(Connection conn,Statement st,ResultSet rs){ if (rs!=null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}finally{rs = null;}}if (st!=null) {try {st.close();} catch (SQLException e) {e.printStackTrace();}finally{st = null;}}if (conn!=null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}finally{conn = null;}}}}2.调⽤存储过程:[java]1. package com.test.demo;2.3. import java.sql.CallableStatement;4. import java.sql.Connection;5.6. import org.junit.Test;7.8. import oracle.jdbc.internal.OracleTypes;9. import oracle.jdbc.oracore.OracleType;10.11. import com.hwb.db.JDBCUtils;12.13. /**14. * 调⽤存储过程⼀个输⼊参数,多个输出参数15. * @author Administrator16. *17. */18. public class ProcedureTest {19.20. /**21. * create or replace procedure selectUserById(uid in number,22. uName out VARCHAR2,23. uAge out number,24. uSex out char)25. */26.27. @Test28. public void testProcedure(){29.30. String sql = "{call selectUserById(?,?,?,?)}";31.32. Connection conn = null;33. CallableStatement call = null;34. try {35. //得到⼀个数据库连接36. conn = JDBCUtils.getConnection();37. //通过连接创建出statement38. call = conn.prepareCall(sql);39. //对于in参数,赋值40. call.setInt(1, 2); // (第⼏个问号,要赋的值)41. //对out参数,声明42. call.registerOutParameter(2, OracleTypes.VARCHAR); //(第⼏个问号,声明的类型)43. call.registerOutParameter(3, OracleTypes.NUMBER);44. call.registerOutParameter(4, OracleTypes.CHAR);45.46. //执⾏调⽤47. call.execute();48.49. //取出结果50. String userName = call.getString(2);51. int userAge = call.getInt(3);52. String userSex = call.getString(4);53.54. System.out.println("⽤户姓名:"+userName+"\n\t年龄:"+userAge+"\n\t性别:"+userSex);55.56. } catch (Exception e) {57. e.printStackTrace();58. }finally{59. //关闭连接,释放资源60. JDBCUtils.release(conn, call, null);61. }62.63. }64. }package com.test.demo;import java.sql.CallableStatement;import java.sql.Connection;import org.junit.Test;import oracle.jdbc.internal.OracleTypes;import oracle.jdbc.oracore.OracleType;import com.hwb.db.JDBCUtils;/*** 调⽤存储过程⼀个输⼊参数,多个输出参数* @author Administrator**/public class ProcedureTest {/*** create or replace procedure selectUserById(uid in number,uName out VARCHAR2,uAge out number,uSex out char)*/@Testpublic void testProcedure(){String sql = "{call selectUserById(?,?,?,?)}";Connection conn = null;CallableStatement call = null;try {//得到⼀个数据库连接conn = JDBCUtils.getConnection();//通过连接创建出statementcall = conn.prepareCall(sql);//对于in参数,赋值call.setInt(1, 2); // (第⼏个问号,要赋的值)//对out参数,声明call.registerOutParameter(2, OracleTypes.VARCHAR); //(第⼏个问号,声明的类型)call.registerOutParameter(3, OracleTypes.NUMBER);call.registerOutParameter(4, OracleTypes.CHAR);//执⾏调⽤call.execute();//取出结果String userName = call.getString(2);int userAge = call.getInt(3);String userSex = call.getString(4);System.out.println("⽤户姓名:"+userName+"\n\t年龄:"+userAge+"\n\t性别:"+userSex);} catch (Exception e) {e.printStackTrace();}finally{//关闭连接,释放资源JDBCUtils.release(conn, call, null);}}}3.调⽤存储⽅法:[java]1. package com.test.demo;2.3. import java.sql.CallableStatement;4. import java.sql.Connection;5.6. import oracle.jdbc.internal.OracleTypes;7.8. import org.junit.Test;9.10. import com.hwb.db.JDBCUtils;11.12. /**13. * 调⽤存储函数,⼀个输⼊参数,⼀个输出参数14. * @author Administrator15. *16. */17. public class FunctionTest {18.19. /**20. * create or replace function selectAge(eno in number)21. return number22. */23. @Test24. public void testFunction(){25. //{?= call <procedure-name>[<arg1>,<arg2>...]}26. String sql = "{call selectAge(?)}";27. Connection conn = null;28. CallableStatement call = null;29. try {30. //得到数据库连接31. conn = JDBCUtils.getConnection();32.33. //通过数据库连接创建statement34. call = conn.prepareCall(sql);35.36. //对于输出参数,声明37. call.registerOutParameter(1, OracleTypes.NUMBER);38.39. //对于输⼊参数,赋值40. call.setInt(2, 3);41.42. //执⾏调⽤43. call.execute();44.45. //获取返回的结果46. int age = call.getInt(1);47.48. System.out.println("该⽤户年龄:"+age);49. } catch (Exception e) {50. e.printStackTrace();51. }finally{52. JDBCUtils.release(conn, call, null);53. }54. }55. }package com.test.demo;import java.sql.CallableStatement;import java.sql.Connection;import oracle.jdbc.internal.OracleTypes;import org.junit.Test;import com.hwb.db.JDBCUtils;/*** 调⽤存储函数,⼀个输⼊参数,⼀个输出参数* @author Administrator**/public class FunctionTest {/*** create or replace function selectAge(eno in number)return number*/@Testpublic void testFunction(){//{?= call <procedure-name>[<arg1>,<arg2>...]}String sql = "{call selectAge(?)}";Connection conn = null;CallableStatement call = null;try {//得到数据库连接conn = JDBCUtils.getConnection();//通过数据库连接创建statementcall = conn.prepareCall(sql);//对于输出参数,声明call.registerOutParameter(1, OracleTypes.NUMBER);//对于输⼊参数,赋值call.setInt(2, 3);//执⾏调⽤call.execute();//获取返回的结果int age = call.getInt(1);System.out.println("该⽤户年龄:"+age);} catch (Exception e) {e.printStackTrace();}finally{JDBCUtils.release(conn, call, null);}}}4.调⽤存储过程,⼀个输⼊参数,返回⼀个查询结果集合[java]1. package com.hwb.demo;2.3. import java.sql.CallableStatement;4. import java.sql.Connection;5. import java.sql.ResultSet;6.7.8.9.10. import org.junit.Test;11.12. import oracle.jdbc.internal.OracleCallableStatement;13. import oracle.jdbc.internal.OracleTypes;14.15. import com.hwb.db.JDBCUtils;16. /**17. * 存储过程⼀个输⼊参数,返回⼀个查询结果集合18. * @author Administrator19. *20. */21. public class CursorTest {22.23. /**24. * create or replace package Mypackage as25. procedure queryUserList(uid in number,userList out usercursor);26. end mypackage;27. */28. @Test29. public void testCursor(){30. String sql = "{call Mypackage.queryUserList(?,?) }";31.32. Connection conn = null;33. CallableStatement call = null;34. ResultSet rs = null;35. try {36. //得到数据库连接37. conn = JDBCUtils.getConnection();38. //通过数据库连接创建statement39. call = conn.prepareCall(sql);40.41. //对于输⼊参数,赋值42. call.setInt(1, 1);43. //对于输出参数,声明44. call.registerOutParameter(2, OracleTypes.CURSOR);45. //执⾏调⽤46. call.execute();47. //将CallableStatement 强转成 OracleCallableStatement ⽤来获取光标类型Cursor,并得到结果ResultSet48. rs = ((OracleCallableStatement)call).getCursor(2);49. //遍历 ResultSet50. while (rs.next()) {51. //根据类型和列名取值52. int id = rs.getInt("user_id"); //括号内为列名53. String user_name = rs.getString("user_name");54. int age = rs.getInt("user_age");55. String sex = rs.getString("user_sex");56. System.out.println("查询到的⽤户信息:\n\tid:"+id+"\n\t姓名:"+user_name57. +"\n\t年龄:"+age+"\n\t性别:"+sex);58. }59.60.61.62. } catch (Exception e) {63. e.printStackTrace();64. }finally{65. JDBCUtils.release(conn, call, rs);66. }67. }68. }package com.hwb.demo;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.ResultSet;import org.junit.Test;import oracle.jdbc.internal.OracleCallableStatement;import oracle.jdbc.internal.OracleTypes;import com.hwb.db.JDBCUtils;/*** 存储过程⼀个输⼊参数,返回⼀个查询结果集合* @author Administrator**/public class CursorTest {/*** create or replace package Mypackage asprocedure queryUserList(uid in number,userList out usercursor);end mypackage;*/@Testpublic void testCursor(){String sql = "{call Mypackage.queryUserList(?,?) }";Connection conn = null;CallableStatement call = null;ResultSet rs = null;try {//得到数据库连接conn = JDBCUtils.getConnection();//通过数据库连接创建statementcall = conn.prepareCall(sql);//对于输⼊参数,赋值call.setInt(1, 1);//对于输出参数,声明call.registerOutParameter(2, OracleTypes.CURSOR);//执⾏调⽤call.execute();//将CallableStatement 强转成 OracleCallableStatement ⽤来获取光标类型Cursor,并得到结果ResultSet rs = ((OracleCallableStatement)call).getCursor(2);//遍历 ResultSetwhile (rs.next()) {//根据类型和列名取值int id = rs.getInt("user_id"); //括号内为列名String user_name = rs.getString("user_name");int age = rs.getInt("user_age");String sex = rs.getString("user_sex");System.out.println("查询到的⽤户信息:\n\tid:"+id+"\n\t姓名:"+user_name+"\n\t年龄:"+age+"\n\t性别:"+sex);}} catch (Exception e) {e.printStackTrace();}finally{JDBCUtils.release(conn, call, rs);}}}。
如何在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 table
insert 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)
IS
BEGIN
/*删除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_test
select* 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 completed
last_inserted_rows_num
---------
3
all_effected_rows_num
---------
4
SQL> print last_inserted_rows_num;
last_inserted_rows_num
---------
3
SQL> print all_effected_rows_num;
all_effected_rows_num
---------
4
SQL>
上述结果表示测试成功
(4)使用下面的Java类TestStoreProcedure.java测试存储过程。
package test;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import oracle.jdbc.OracleTypes;
/**
* This class is used to test Oracle store procedure
* @author CarlWu
*
*/
public class TestStoreProcedure{
/**
* 测试主方法
* @param args
*/
public static void main(String[] args) {
Connection con=null;
try {
//获得数据库连接
ng.Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection("jdbc:oracle:thin:scott/tiger@localhost:1521:LEGDB");
//测试存储过程
TestStoreProcedure sp=new TestStoreProcedure();
sp.execute(con,"carl_sp_test","carl");
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
} catch (SQLException sqlE) {
sqlE.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}finally {
if (con != null) {
try {
con.close();
} catch (Exception e) {
}
}
}
}
/**
* 该方法用来调用Oracle存储过程
* @param con 数据库连接
* @param parameter传入存储过程的参数值
* @throws SQLException SQL 异常
*/
public void execute(Connection con,String sp_name, String parameter) throws SQLException{
//调用存储过程
CallableStatement callStat=con.prepareCall("{call "+sp_name+"(?,?,?)}");
//最后一次插入的行数
int last_inserted_rows=0;
//总影响行数
int all_effected_rows=0;
//设置输入参数值
callStat.setString(1, parameter);
//注册存储过程的第二、第三个参数类型
callStat.registerOutParameter(2, OracleTypes.NUMBER);
callStat.registerOutParameter(3, OracleTypes.NUMBER);
//执行存储过程
callStat.execute();
//从存储过程执行结果中获得第二、第三个参数值
last_inserted_rows=callStat.getInt(2);
all_effected_rows=callStat.getInt(3);
//关闭CallableStatement,释放资源
callStat.close();
//在控制台中打印结果
System.out.println("最后一次插入条数:"+last_inserted_rows);
System.out.println("总影响行数:"+all_effected_rows);
}
}
(5)程序运行结果.
最后一次插入条数:3
总影响行数:8。