java调用Oracle中的存储过程
2013-08-30 20:02
686 查看
1、首先你得在数据库中写一个存储过程
例如:
调用代码如下:
上面是我在工作中写的一个针对性的稍微通用一点的访问存过的方法
下面是java中用jdbc访问存过的方式,其实和上面的也差不多,区别不大
在设置传参的时候会用setXXX方法对要传到存过中的参数进行赋值,而且要注意传参的类型
在获取存过输出参数的时候也是用相应的getXXX来进行获取,当然在获取之前还需要设置输出参数的位置和类型,这都是很重要的,registerOutParameter是用来设置输出参数的函数
例如:
P_DZK_NETRES(V_DZID IN NUMBER,V_DZTYPE IN NUMBER ,V_ZYBM IN VARCHAR2,V_DZ IN VARCHAR2,V_RENUM OUT NUMBER)
调用代码如下:
/** * 描述: 执行存过和函数,paramValues与paramClass的长度必须是一致的,对java的几种基本数据类型通用 * @param func 存过调用字符串:func(?,?,?,?) * @param paramValues 要传的参数值,要保证类型正确,以字符串数组的形式 * @param paramClass 要传的参数值的类型的一个示例,根据这个判断这个参数是什么类型的,例如:Object[] paramClass = {1L,1,"1","1"}; * @param returnIndex 输出参的位置 * @return 存过输出参的值 * @throws JCtnException */ public String executeCallable(String func, String[] paramValues, Object[] paramClass, int returnIndex) throws JCtnException{ if(paramValues.length != paramClass.length) { throw new JCtnException("存过参数值与参数类型的个数不一致!"); } String res = ""; CallableStatement cstmt = null; TransactionUtil transaction = tranLocal.get(); Connection conn = null; try { String sql = "{call " + func + "}"; if(transaction == null){//未使用事务 conn = poolHashMap.get(this.poolUrl).getConnection(); }else{//使用事务 conn = transaction.getConn(); } cstmt = conn.prepareCall(sql); int index = 1; boolean flag = false; for (int i = 1; i <= paramValues.length; i++) { index = i; if(i == returnIndex) {//第returnIndex个位置为输出参数,出参为中间的某一个 flag = true; } if(flag == true) { index ++; } try { if(paramClass[i-1] instanceof Integer) { cstmt.setInt(index, Integer.valueOf(paramValues[i-1])); } else if(paramClass[i-1] instanceof String) { cstmt.setString(index, paramValues[i-1]); } else if(paramClass[i-1] instanceof Boolean) { cstmt.setBoolean(index, Boolean.valueOf(paramValues[i-1])); } else if(paramClass[i-1] instanceof Double) { cstmt.setDouble(index, Double.valueOf(paramValues[i-1])); } else if(paramClass[i-1] instanceof Float) { cstmt.setFloat(index, Float.valueOf(paramValues[i-1])); } else if(paramClass[i-1] instanceof Long) { cstmt.setLong(index, Long.valueOf(paramValues[i-1])); } else if(paramClass[i-1] instanceof Byte) { cstmt.setByte(index, Byte.valueOf(paramValues[i-1])); } } catch (Exception e) { throw new JCtnException(e); } } //设置出参 cstmt.registerOutParameter(returnIndex, Types.VARCHAR); cstmt.execute(); res = cstmt.getString(returnIndex); } catch (HibernateException e) { throw new JCtnException(e); } catch (SQLException e) { throw new JCtnException(e); } finally { try { if (cstmt != null) { cstmt.close(); } } catch (SQLException e) { throw new JCtnException(e); } } return res; }
上面是我在工作中写的一个针对性的稍微通用一点的访问存过的方法
下面是java中用jdbc访问存过的方式,其实和上面的也差不多,区别不大
CallableStatement cs = null; try { Class.forName("oracle.jdbc.driver.OracleDriver"); conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "admin", "admin"); cs = conn.prepareCall("{?=call P_DZK_NETRES(?,?,?,?,?)}"); //给存储过程中的输入参数赋值 cs.setLong(1, 11111111); cs.setLong(2, 22222222); cs.setString(3, "abc"); cs.setString(4,"abcd"); //存储过程中的输出参数处理方式 cs.registerOutParameter(5, Types.VARCHAR); cs.execute(); //取出存储过程的返回值 String str = cs.getString(5); System.out.println(str); } catch (Exception e) { e.printStackTrace(); }finally{ try { cs.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } }
在设置传参的时候会用setXXX方法对要传到存过中的参数进行赋值,而且要注意传参的类型
在获取存过输出参数的时候也是用相应的getXXX来进行获取,当然在获取之前还需要设置输出参数的位置和类型,这都是很重要的,registerOutParameter是用来设置输出参数的函数
相关文章推荐
- 游标、例外、存储过程、存储函数、java调用存储过程、触发器(Oracle之二)
- java调用ORACLE 存储过程返回值
- Java如何实现调用oracle带有返回值的存储过程
- oracle 存储过程编写和java程序调用oracle存储过程
- java调用ORACLE 存储过程返回值22
- Java 开发中之七:oracle中的子程序之在JAVA中如何调用存储过程,函数。
- java调用ORACLE 存储过程返回值33
- java 调用Oracle 存储过程(SpringBoot下的事务管理)
- 触发器,存储过程,oracle调用java方法
- java 调用 oracle 存储过程
- java 调用 oracle 存储过程
- java调用oracle含输入和输出数组的存储过程
- oracle实现存储过程的分页并用java代码调用存储过程
- java调用oracle中输入参数是数组类型的函数或者存储过程
- Oracle-存储过程-参数为数组-返回值为集合,java-调用存储过程
- java调用oracle 存储过程 以及游标使用
- oracle pl/sql之java中调用oracle有参存储过程
- java调用oracle返回结果集的存储过程
- java 调用oracle 存储过程
- java 调用Oracle 存储过程 Jdbc/Hibernate