java代码调用存储过程和存储方法

准备一个oracle 的JDBC jar 包:ojdbc14_11g.jar

首先找到你的 oracle 安装位置,例如:



1.创建一个JDBC数据库连接工具类:

[java]  view plain  copy
  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.      * @return 
  28.      */  
  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 conn 
  41.      * @param st 
  42.      * @param rs 
  43.      */  
  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. }  

2.调用 存储过程:

[java]  view plain  copy
  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 Administrator 
  16.  * 
  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.     @Test  
  28.     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.             //通过连接创建出statement  
  38.             call = conn.prepareCall(sql);  
  39.             //对于in参数,赋值  
  40.             call.setInt(12);  // (第几个问号,要赋的值)  
  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. }  

3.调用存储方法:

[java]  view plain  copy
  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 Administrator 
  15.  * 
  16.  */  
  17. public class FunctionTest {  
  18.   
  19.     /** 
  20.      * create or replace function selectAge(eno in number) 
  21.         return number  
  22.      */  
  23.     @Test  
  24.     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.             //通过数据库连接创建statement  
  34.             call = conn.prepareCall(sql);  
  35.               
  36.             //对于输出参数,声明  
  37.             call.registerOutParameter(1, OracleTypes.NUMBER);  
  38.               
  39.             //对于输入参数,赋值  
  40.             call.setInt(23);  
  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. }  

4.调用存储过程,一个输入参数,返回一个查询结果集合

[java]  view plain  copy
  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 Administrator 
  19.  * 
  20.  */  
  21. public class CursorTest {  
  22.   
  23.     /** 
  24.      * create or replace package Mypackage as 
  25.         procedure queryUserList(uid in number,userList out usercursor); 
  26.         end mypackage; 
  27.      */  
  28.     @Test  
  29.     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.             //通过数据库连接创建statement  
  39.             call = conn.prepareCall(sql);  
  40.               
  41.             //对于输入参数,赋值  
  42.             call.setInt(11);  
  43.             //对于输出参数,声明  
  44.             call.registerOutParameter(2, OracleTypes.CURSOR);  
  45.             //执行调用  
  46.             call.execute();  
  47.             //将CallableStatement 强转成  OracleCallableStatement 用来获取光标类型Cursor,并得到结果ResultSet  
  48.             rs = ((OracleCallableStatement)call).getCursor(2);  
  49.             //遍历 ResultSet  
  50.             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_name  
  57.                         +"\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. }  
注意,以下使用数据库为sql2000,驱动jtds1.2.2 一、调用存储过程(无结果集返回) Connection connection = ConnectionHelper.getConnection(); CallableStatement callableStatement = connection.prepareCall("{ call procedureName(?,?) }"); callableStatement.setString(1, "xxxxxxxx"); callableStatement.setString(2, "xxxxxxxx"); callableStatement.execute(); //获得sql的消息并输出,这个估计很多人都需要 SQLWarning sqlWarning = callableStatement.getWarnings(); while (sqlWarning != null) { System.out.println("sqlWarning.getErrorCode() = " + sqlWarning.getErrorCode()); System.out.println("sqlWarning.getSQLState() = " + sqlWarning.getSQLState()); System.out.println("sqlWarning.getMessage() = " + sqlWarning.getMessage()); sqlWarning = sqlWarning.getNextWarning(); } //close ConnectionHelper.closeConnection(callableStatement, connection); 二、调用存储过程,返回sql类型数据(非记录集) Connection connection = ConnectionHelper.getConnection(); CallableStatement callableStatement = connection.prepareCall("{ call procedureName(?,?,?) }"); callableStatement.setString(1, "xxxxxxxx"); callableStatement.setString(2, "xxxxxxxx"); //重点是这句1 callableStatement.registerOutParameter(3, Types.INTEGER); callableStatement.execute(); //取返回结果,重点是这句2 //int rsCount = callableStatement.getInt(3); //close ConnectionHelper.closeConnection(callableStatement, connection); 三、重点来了,返回记录集,多记录集 注意,不需要注册返回结果参数,只需要在sql中select出结果即可 例如:select * from tableName 即可得到返回结果 Connection connection = ConnectionHelper.getConnection(); CallableStatement callableStatement = connection.prepareCall("{ call procedureName(?) }"); //此处参数与结果集返回没有关系 callableStatement.setString(1, "xxxxxxxx"); callableStatement.execute(); ResultSet resultSet = callableStatement.getResultSet(); //以上两个语句,可以使用ResultSet resultSet = callableStatement.executeQuery();替代 //多结果返回 ResultSet resultSet2; if (callableStatement.getMoreResults()) { resultSet2 = callableStatement.getResultSet(); while (resultSet2.next()) { } } //close ConnectionHelper.closeConnection(callableStatement, connection); 提示:多结果返回可以使用如下代码(以上主要让大家明白,单一结果和多结果的区别): Boolean hasMoreResult = true; while (hasMoreResult) { ResultSet resultSet = callableStatement.getResultSet(); while (resultSet.next()) { } hasMoreResult = callableStatement.getMoreResults(); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值