您的位置:首页 > 数据库 > Oracle

java调用Oracle中的存储过程

2013-08-30 20:02 686 查看
1、首先你得在数据库中写一个存储过程

例如:

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是用来设置输出参数的函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: