如何在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如何在Java中调用存储过程?在Java开发中,有时候需要调用数据库中已经定义好的存储过程来执行特定的操作。
存储过程是一组预定义的SQL语句集合,它们经过编译,存储在数据库中并可以多次重复调用。
本文将详细介绍如何在Java中调用存储过程,并给出逐步的代码示例。
步骤一:建立数据库连接首先,我们需要建立与数据库的连接。
在Java中,可以使用JDBC(Java Database Connectivity)技术来实现与数据库的连接。
JDBC是Java提供的一个标准API,用于与各种关系型数据库进行交互。
在调用存储过程之前,需要先加载数据库驱动和建立数据库连接。
下面的代码展示了如何加载MySQL数据库驱动并建立与数据库的连接:import java.sql.*;public class CallStoredProcedure {public static void main(String[] args) {Connection conn = null;Statement stmt = null;try{Class.forName("com.mysql.jdbc.Driver");conn =DriverManager.getConnection("jdbc:mysql:localhost/testdb", "username", "password");}catch(SQLException se){se.printStackTrace();}catch(Exception e){e.printStackTrace();}}}其中,"com.mysql.jdbc.Driver"是MySQL数据库的驱动类名,"jdbc:mysql:localhost/testdb"是数据库连接的URL,"username"和"password"分别是数据库的用户名和密码。
在Java中如何调用存储过程。
数据库中存储过程一般可以分为以下几类:1:有参数无返回值2:有参数有返回值3:返回结果集account表结构如下:1:开户存储过程:Create proc newAccount@account varchar(30),@balance moneyAsInsert into account values(@account,@balance)Go用Java 调用上述存储过程的代码如下:package newer.test;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.SQLException;import java.io.*;import newer.db.DBConnection;import newer.pojo.Account;public class TestProcedure {private Connection con = null;public boolean createAccount(Account account){boolean flag = false;try {con = DBConnection.getConnection();CallableStatement cstmt =con.prepareCall("{call newAccount(?,?)}");cstmt.setString(1, account.getAccount());cstmt.setFloat(2, account.getBalance());if(!cstmt.execute()){flag = true;}con.close();} catch (SQLException e) {e.printStackTrace();}return flag;}public static void main(String[] args){BufferedReader br = new BufferedReader(new InputStreamReader(System.in));System.out.print("请输入新的账号:");Account newAcc = new Account();try{newAcc.setAccount(br.readLine());System.out.print("请输入存款金额:");newAcc.setBalance(Float.parseFloat(br.readLine()));if(new TestProcedure().createAccount(newAcc)){System.out.println("开户成功!");System.out.println(newAcc);}else{System.out.println("服务器忙,请稍后再试!谢谢!");}} catch (Exception e){e.printStackTrace();}}}2:查询余额存储过程:Create proc lookBalance@account varchar(30),@balance money outputAsSelect @balance = balance from account where account = @accountReturn @balanceGo用Java 调用上述存储过程的代码如下:package newer.test;import java.io.BufferedReader;import java.io.InputStreamReader;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.SQLException;import java.sql.Types;import newer.db.DBConnection;import newer.pojo.Account;public class TestProcedureWithOne {private Connection con = null;public Account queryBalance(Account account) {try {con = DBConnection.getConnection();CallableStatement cstmt = con.prepareCall("{call lookBalance(?,?)}");cstmt.setString(1, account.getAccount());cstmt.registerOutParameter(2, Types.DECIMAL);//注册输出类型的变量cstmt.execute();float balance = cstmt.getFloat(2); //获取存储过程的返回值account.setBalance(balance);cstmt.close();con.close();} catch (SQLException e) {e.printStackTrace();}return account;}public static void main(String[] args) {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));System.out.print("请输入要查询余额的账号:");Account qryAcc = new Account();try {qryAcc.setAccount(br.readLine());System.out.println(new TestProcedureWithOne().queryBalance(qryAcc));} catch (Exception e) {e.printStackTrace();}}}3:返回结果集的存储过程:Create proc getAccountsAsSelect * from accountGopackage newer.test;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import newer.db.DBConnection;import newer.pojo.Account;public class TestProcedureWithRess {private Connection con = null;private ResultSet rs = null;public List queryAccount() {List al = new ArrayList();try {con = DBConnection.getConnection();CallableStatement cstmt = con.prepareCall("{call getAccounts}");cstmt.execute();rs = cstmt.getResultSet();while(rs.next()){Account ac = new Account();ac.setAccount(rs.getString(1));ac.setBalance(rs.getFloat(2));al.add(ac);}cstmt.close();con.close();return al;} catch (SQLException e) {e.printStackTrace();}return null;}public static void main(String[] args){TestProcedureWithRess tw = new TestProcedureWithRess();List list= tw.queryAccount();Iterator itr = list.iterator();while(itr.hasNext()){System.out.println(itr.next());}}}。
java调用db2存储过程例子java调用db2存储过程例子1. JAVA 调用db2存储过程最简单的例子:存储过程创建代码:<o:p></o:p>sql 代码1.SET SCHEMA IES ;2.3.Create procedure ies.test()4.NGUAGE SQL6.7.Update t_ryxx set xm =’xy’ where ryxxid=’xm’java 代码1.conn = DbMaster.getConn();2.System.out.println("begin………");3.proc = conn.prepareCall("{call test()}");4.proc.execute();<o:p></o:p>2. Java调用db2带输入参数存储过程的例子:<o:p></o:p>Db2创建存储过程的代码:<o:p></o:p>sql 代码5.Drop procedure ies.test();6.SET SCHEMA IES ;7.Create procedure ies.test(in i_ryxxid varchar(50))NGUAGE SQL9.Update t_ryxx set xm =’xy’ where ryxxid=i_ryxxid10.java 代码11.conn = DbMaster.getConn();12.System.out.println("begin");13.proc = conn.prepareCall("{call test(?)}");14.proc.setString(1,"RY0003");15.proc.execute();16.System.out.println("end:");3.有输入输出参数的代码:创建存储过程的代码:sql 代码17.SET SCHEMA IES ;18.CREATE PROCEDURE IES.test (IN in_ryxxid varchar(50),out out_xm varchar(50))NGUAGE SQL20.21.select xm into out_xm from ies.t_ryxx where ryxxid=in_ryxxid;java 代码22.proc = conn.prepareCall("{ call test(?,?)}");23.proc.setString(1, "011900380103");24.proc.registerOutParameter(2, Types.VARCHAR);25.proc.execute();26.String xm = proc.getString(2);27.System.out.println("end:"+xm);4.带有游标的存储过程(不知道这里的游标什么时候close的。
Java调用SQLServer的存储过程详解Java调用SQL Server的存储过程是一种常见的数据库操作方式,本文将详细介绍Java调用SQL Server存储过程的步骤和注意事项。
主要包括如下内容:存储过程简介、Java调用存储过程的方法、事务管理、参数传递、数据操作和错误处理等方面。
一、存储过程简介存储过程是SQL Server中一组预先编译的SQL语句集合,它们被命名并存储在数据库中,可以被多次调用。
存储过程可以接受参数,可以返回结果集。
二、Java调用存储过程的方法1. 使用CallableStatement对象调用存储过程。
2. 使用JdbcTemplate的execute(方法调用存储过程。
三、事务管理四、参数传递存储过程通常需要传递参数,Java调用存储过程时需要注意以下几点:1. 设置参数的类型和值:使用CallableStatement对象的setXXX(方法,其中XXX为参数类型,如setInt(、setString(等。
2. 注册输出参数:将输出参数的位置和类型进行注册,使用CallableStatement对象的registerOutParameter(方法。
3. 获取输出参数的值:使用CallableStatement对象的getXXX(方法,其中XXX为参数类型,如getInt(、getString(等。
五、数据操作在Java调用存储过程时,可以执行各种数据库操作,如插入数据、更新数据等。
通过设置SQL语句和调用executeUpdate(或executeQuery(方法来实现。
六、错误处理在Java调用存储过程时,需要进行错误处理。
可以通过捕获SQL异常并输出错误信息来实现。
使用try-catch块来捕获异常,然后使用SQLException对象获取具体的错误信息。
总结:本文详细介绍了Java调用SQL Server存储过程的步骤和注意事项。
主要包括存储过程简介、Java调用存储过程的方法、事务管理、参数传递、数据操作和错误处理等方面。
java存储过程写法在Java中,可以通过JDBC(Java Database Connectivity)来调用和执行存储过程。
下面我将从多个角度来介绍Java中存储过程的写法。
1. 使用CallableStatement:在Java中,可以使用CallableStatement来调用存储过程。
首先,你需要获取数据库连接,然后创建一个CallableStatement对象,并设置存储过程的参数,最后执行存储过程。
例如:java.Connection conn = DriverManager.getConnection(url, username, password);CallableStatement cs = conn.prepareCall("{callyour_stored_procedure(?, ?)}");cs.setInt(1, parameter1);cs.setString(2, parameter2);cs.execute();2. 使用存储过程注解:一些持久层框架(如MyBatis)提供了注解的方式来调用存储过程。
你可以在Java方法上使用注解来指定要调用的存储过程的名称和参数。
例如(使用MyBatis的@Select注解):java.@Select("{call your_stored_procedure(#{parameter1, mode=IN, jdbcType=INTEGER}, #{parameter2, mode=IN, jdbcType=VARCHAR})}")。
void callStoredProcedure(int parameter1, Stringparameter2);3. 使用存储过程的ORM映射:一些ORM框架(如Hibernate)允许你将存储过程映射为Java方法,然后直接调用这些方法来执行存储过程。
在Java中,可以使用`PreparedStatement`来调用存储过程。
存储过程是在数据库中预定义的一些SQL语句,可以在需要时调用它们。
以下是一个使用`PreparedStatement`调用存储过程的示例:```java// 假设你已经建立了一个数据库连接对象 "conn"// 定义存储过程的名称和参数String procedureName = "your_procedure_name";String param1 = "param1_value";String param2 = "param2_value";// 创建 PreparedStatement 对象PreparedStatement pstmt = conn.prepareCall("{call " + procedureName + "(?, ?)}");// 设置参数值pstmt.setString(1, param1);pstmt.setString(2, param2);// 执行存储过程pstmt.execute();// 关闭PreparedStatement对象pstmt.close();```在上面的示例中,我们首先定义了存储过程的名称和参数。
然后,我们创建了一个`PreparedStatement`对象,并使用`prepareCall`方法指定要调用的存储过程的名称和参数列表。
接下来,我们使用`setString`方法为第一个和第二个参数设置了值。
最后,我们使用`execute`方法执行存储过程,并关闭了`PreparedStatement`对象。
请注意,存储过程的名称和参数列表需要根据实际情况进行修改。
此外,还需要根据存储过程的定义设置正确的参数类型和数量。
存储过程使用说明执行存储过程的类:ProcedureExecutor ,使用该类时,先要创建该类的对象new ProcedureExecutor(); 然后调用execProcedure方法,该方法需要传入两个参数,第一个是存储过程的名称(带模式名),第二个是回调对象。
存储过程回调类:ProcedureCallBack,执行存储过程时,需要传入该类的一个实例,创建该类的对象时,必须实现两个方法mapRow和registerParameter。
存储过程返回值类:ProcedureResult,该类封装了存储过程的返回值//取单个输出值示例//创建一个回调对象,后面传给存储过程执行对象ProcedureCallBack pcb=new ProcedureCallBack(){public Object mapRow(ResultSet rs,int rowNum) throws SQLException{ return rs.getString(2);}public void registerParameter() throws SQLException{//设置第一个参数setInt(1,398240);//设置输出参数类型registerOutParameter(2,Types.VARCHAR);}};//创建一个存储过程执行对象ProcedureExecutor procedureExecutor=new ProcedureExecutor();//执行存储过程(传入存储过程名称和回调对象)ProcedureResult pr=procedureExecutor.execProcedure("USERID.SEL_PRO", pcb);//取得输出值列表List outList=pr.getOutputList();for(int i=0;i<outList.size();i++){System.out.println((String)outList.get(i));}//取一个ResultSet 示例ProcedureCallBack pcb=new ProcedureCallBack(){public Object mapRow(ResultSet rs,int rowNum) throws SQLException{ //将输出值存入自己定义个一个javabean中return new DataBean(rs.getString(1),rs.getString(2));}public void registerParameter() throws SQLException{//setInt(1,398240);//registerOutParameter(2,Types.VARCHAR);}};ProcedureResultpr=procedureExecutor.execProcedure("PUTER_RS", pcb);List list=pr.getResultList();for(int i=0;i<list.size();i++){DataBean dataBean=(DataBean)list.get(i);System.out.println(dataBean.getComputer_name());System.out.println(dataBean.getCpu());}}//取多个输出值示例ProcedureCallBack pcb=new ProcedureCallBack(){public Object mapRow(ResultSet rs,int rowNum) throws SQLException{ return null;//newDataBean(rs.getString(1),rs.getString(2));}public void registerParameter() throws SQLException{setInt(1,400153);registerOutParameter(2,Types.BIGINT);registerOutParameter(3,Types.INTEGER);registerOutParameter(4,Types.SMALLINT);registerOutParameter(5,Types.CHAR);registerOutParameter(6,Types.DECIMAL);registerOutParameter(7,Types.DOUBLE);registerOutParameter(8,Types.DOUBLE);registerOutParameter(9,Types.DATE);registerOutParameter(10,Types.TIMESTAMP);registerOutParameter(11,Types.CLOB);registerOutParameter(12,Types.BLOB);registerOutParameter(13,Types.VARCHAR);}};ProcedureResultpr=procedureExecutor.execProcedure("USERID.DATA_OUTLIST", pcb);List list=pr.getOutputList();for(int i=0;i<list.size();i++){System.out.println(list.get(i));} }。
java下实现调用oracle的存储过程和函数在oracle下创建一个test的账户,然后1.创建表:STOCK_PRICES[cpp]view plaincopyprint?1.--创建表格2.CREATE TABLE STOCK_PRICES(3.RIC VARCHAR(6) PRIMARY KEY,4.PRICE NUMBER(7,2),5.UPDATED DATE );2.插入测试数据:[sql]view plaincopyprint?1.--插入数据2.INSERT INTO stock_prices values('1111',1.0,SYSDATE);3.INSERT INTO stock_prices values('1112',2.0,SYSDATE);4.INSERT INTO stock_prices values('1113',3.0,SYSDATE);5.INSERT INTO stock_prices values('1114',4.0,SYSDATE);3.建立一个返回游标:PKG_PUB_UTILS[cpp]view plaincopyprint?1.--建立一个返回游标2.CREATE OR REPLACE PACKAGE PKG_PUB_UTILS IS3.--动态游标4.TYPE REFCURSOR IS REF CURSOR;5.END PKG_PUB_UTILS;4.创建和存储过程:P_GET_PRICE[sql]view plaincopyprint?1.--创建存储过程2.CREATE OR REPLACE PROCEDURE P_GET_PRICE3.(4.AN_O_RET_CODE OUT NUMBER,5.AC_O_RET_MSG OUT VARCHAR2,6.CUR_RET OUT PKG_PUB_UTILS.REFCURSOR,7.AN_I_PRICE IN NUMBER8.)9.IS10.BEGIN11.AN_O_RET_CODE := 0;12.AC_O_RET_MSG := '操作成功';13.14.OPEN CUR_RET FOR15.SELECT * FROM STOCK_PRICES WHERE PRICE<AN_I_PRICE;16.EXCEPTION17.WHEN OTHERS THEN18.AN_O_RET_CODE := -1;19.AC_O_RET_MSG := '错误代码:' || SQLCODE || CHR(13) || '错误信息:' || SQLERRM;20.END P_GET_PRICE;5.创建函数:[cpp]view plaincopyprint?1.--创建函数:F_GET_PRICE2.CREATE OR REPLACE FUNCTION F_GET_PRICE(v_price IN NUMBER)3.RETURN PKG_PUB_UTILS.REFCURSOR4.AS5.stock_cursor PKG_PUB_UTILS.REFCURSOR;6.BEGIN7.OPEN stock_cursor FOR8.SELECT * FROM stock_prices WHERE price < v_price;9.RETURN stock_cursor;10.END;6.JAVA调用存储过程返回结果集JDBCoracle10G_INVOKEPROCEDURE.java[java]view plaincopyprint?1.import java.sql.*;2.import oracle.jdbc.OracleCallableStatement;3.import oracle.jdbc.OracleTypes;4.5./* 本例是通过调用oracle的存储过程来返回结果集:6.* oracle 9i、10G 的jdbc由1个jar包组成:classes12.zip7.*/8.public class JDBCoracle10G_INVOKEPROCEDURE {9.Connection conn = null;10.Statement statement = null;11.ResultSet rs = null;12.CallableStatement stmt = null;13.14.String driver;15.String url;16.String user;17.String pwd;18.String sql;19.String in_price;20.21.public JDBCoracle10G_INVOKEPROCEDURE()22.{23.driver = "oracle.jdbc.driver.OracleDriver";24.url = "jdbc:oracle:thin:@localhost:1521:ORCL";25.// oracle 用户er = "test";27.// oracle 密码28.pwd = "test";29.init();30.// mysid:必须为要连接机器的sid名称,否则会包以下错:31.// java.sql.SQLException: Io 异常: Connection32.//refused(DESCRIPTION=(TMP=)(VSNNUM=169870080)(ERR=12505)(ERROR_STACK=(ERRO R=(CODE=12505)(EMFI=4))))33.// 参考连接方式:34.// Class.forName( "oracle.jdbc.driver.OracleDriver" );35.// cn = DriverManager.getConnection(36.// "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );37.38.}39.40.public void init() {41.System.out.println("oracle jdbc test");42.try {43.Class.forName(driver);44.System.out.println("driver is ok");45.conn = DriverManager.getConnection(url, user, pwd);46.System.out.println("conection is ok");47.statement = conn.createStatement();48.// conn.setAutoCommit(false);49.// 输入参数50.in_price = "3.0";51.// 调用函数52.stmt = conn.prepareCall("call P_GET_PRICE(?,?,?,?)");53.stmt.registerOutParameter(1, java.sql.Types.FLOAT);54.stmt.registerOutParameter(2, java.sql.Types.CHAR);55.stmt.registerOutParameter(3, oracle.jdbc.OracleTypes.CURSOR);56.stmt.setString(4, in_price);57.stmt.executeUpdate();58.int retCode = stmt.getInt(1);59.String retMsg = stmt.getString(2);60.if (retCode == -1) { // 如果出错时,返回错误信息61.System.out.println("报错!");62.} else {63.// 取的结果集的方式一:64.rs = ((OracleCallableStatement) stmt).getCursor(3);65.// 取的结果集的方式二:66.// rs = (ResultSet) stmt.getObject(3);67.String ric;68.String price;69.String updated;70.// 对结果进行输出71.while (rs.next()) {72.ric = rs.getString(1);73.price = rs.getString(2);74.updated = rs.getString(3);75.System.out.println("ric:" + ric + ";-- price:" + price76.+ "; --" + updated + "; ");77.}78.}79.80.} catch (Exception e) {81.e.printStackTrace();82.} finally {83.System.out.println("close ");84.}85.}86.87.public static void main(String args[])// 自己替换[]88.{89.new JDBCoracle10G_INVOKEPROCEDURE();90.}91.}7.开发JAVA调用函数返回结果集JDBCoracle10G_INVOKEFUNCTION.java[java]view plaincopyprint?1.import java.sql.*;2.import oracle.jdbc.OracleCallableStatement;3.import oracle.jdbc.OracleTypes;4.5./*6./* 本例是通过调用oracle的函数来返回结果集:7.* oracle 9i、10G 的jdbc由1个jar包组成:classes12.zip8.*/9.public class JDBCoracle10G_INVOKEFUNCTION {10.Connection conn = null;11.Statement statement = null;12.ResultSet rs = null;13.CallableStatement stmt = null;14.15.String driver;16.String url;17.String user;18.String pwd;19.String sql;20.String in_price;21.22.public JDBCoracle10G_INVOKEFUNCTION()23.{24.driver = "oracle.jdbc.driver.OracleDriver";25.url = "jdbc:oracle:thin:@localhost:1521:ORCL";26.// oracle 用户er = "test";28.// oracle 密码29.pwd = "test";30.init();31.// mysid:必须为要连接机器的sid名称,否则会包以下错:32.// java.sql.SQLException: Io 异常: Connection33.//refused(DESCRIPTION=(TMP=)(VSNNUM=169870080)(ERR=12505)(ERROR_STACK=(ERRO R=(CODE=12505)(EMFI=4))))34.// 参考连接方式:35.// Class.forName( "oracle.jdbc.driver.OracleDriver" );36.// cn = DriverManager.getConnection(37.// "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );38.}39.40.public void init() {41.System.out.println("oracle jdbc test");42.try {43.Class.forName(driver);44.System.out.println("driver is ok");45.conn = DriverManager.getConnection(url, user, pwd);46.System.out.println("conection is ok");47.statement = conn.createStatement();48.// conn.setAutoCommit(false);49.// 输入参数50.in_price = "5.0";51.// 调用函数52.stmt = conn.prepareCall("{? = call F_GET_PRICE(?)}");53.// stmt.registerOutParameter(1, java.sql.Types.FLOAT);54.// stmt.registerOutParameter(2, java.sql.Types.CHAR);55.stmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);56.stmt.setString(2, in_price);57.stmt.executeUpdate();58.// 取的结果集的方式一:59.rs = ((OracleCallableStatement) stmt).getCursor(1);60.// 取的结果集的方式二:61.// rs = (ResultSet) stmt.getObject(1);62.String ric;63.String price;64.String updated;65.66.while (rs.next()) {67.ric = rs.getString(1);68.price = rs.getString(2);69.updated = rs.getString(3);70.System.out.println("ric:" + ric + ";-- price:" + price + "; --"71.+ updated + "; ");72.}73.74.} catch (Exception e) {75.e.printStackTrace();76.} finally {77.System.out.println("close ");78.}79.}80.81.public static void main(String args[])// 自己替换[]82.{83.new JDBCoracle10G_INVOKEFUNCTION();84.}85.}。
java jdbc mysql 调用存储过程写法-回复Java JDBC MySQL 调用存储过程写法在Java开发中,使用JDBC连接MySQL数据库是一种常见的做法。
当需要执行一些复杂的数据库操作时,使用存储过程可以提高数据库操作的效率和安全性。
本文将详细介绍在Java中使用JDBC调用MySQL存储过程的写法,涵盖以下内容:1. 准备工作2. 创建存储过程3. 使用JDBC调用存储过程1. 准备工作在开始之前,确保你已经完成以下准备工作:- 安装和配置Java JDK和MySQL数据库- 创建Java项目并导入JDBC驱动程序首先,我们需要在Java项目中导入MySQL的JDBC驱动程序,以便能够连接和操作MySQL数据库。
你可以从MySQL官方网站下载并导入JDBC 驱动程序。
在项目的构建路径下创建lib文件夹,将驱动程序的JAR文件复制到该文件夹中。
然后,右键点击JAR文件,选择Build Path -> Add to Build Path,将其添加到项目的构建路径中。
2. 创建存储过程在MySQL中,存储过程是一组预编译的SQL语句组成的块,它们按照特定的顺序执行,可以带有参数,并且可以通过调用来执行。
下面是一个简单的示例存储过程,用于从一个名为customer的表中获取所有客户的信息:DELIMITERCREATE PROCEDURE GetAllCustomers ()BEGINSELECT * FROM customer;ENDDELIMITER ;上述存储过程使用DELIMITER关键字来改变MySQL的语句分隔符,默认情况下分隔符为分号。
在存储过程内部,我们使用SELECT语句从customer表中获取所有的客户信息。
3. 使用JDBC调用存储过程在Java中使用JDBC调用MySQL存储过程需要以下几个步骤:3.1 创建数据库连接首先,我们需要使用JDBC创建与数据库的连接。
如何在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。