我有一些旧的C代码我正在转向Java,我必须将现有的SQL函数移植到JDBC中。命令是这样写的(很多例子中的两个):
RESULT:=1 + ?
IF ? > 0 THEN RESULT:=0 ELSE RESULT:= 1; END IF;
这是两个例子(单独的命令)。 更改命令的语法不是一个选项,但一些聪明的运行时替换是有效的。注意?是将在运行时从其他数据填充的值。
我已经尝试过将它作为语句,预处理语句和可调用语句,而且我似乎无法获得正确的语法来获取“RESULT”(实际上,无法在任何语句上执行它)
出于测试目的,我一直在尝试一个简单的命令:
RESULT:=1+2
RESULT:=1+?
只是为了看看我是否可以使用该类型的语句。但没有运气。
从代码看起来合理的最常见的答案是:
String queryString = "declare result integer; begin RESULT:= 1 + 3; ? := RESULT; end";
try (CallableStatement cst = conn.prepareCall(queryString))
{
cst.registerOutParameter(1, Types.INTEGER);
cst.execute();
}
当我运行它时,在执行(或executeUpdate,没有区别)我得到了Oracle 17002/08006(大小数据单元不匹配,网络问题/无效连接)。但我必须相信错误有点像红色鲱鱼,因为连接肯定是有效的,并且一个简单的声明工作正常。
有没有人知道正确的JDBC方法来调用它并获得有效的结果(超出结果)?
如果重要的话,我正在使用Java 7和Oracle 11g。
答案 0 :(得分:0)
这是一个调用存储过程的示例,该存储过程接受Integer参数并返回单个值(我的Java方法返回一个Object,您可以将它转换为您喜欢的任何值)。
public Object getResultFromStoredProcedure(String query,Integer param) {
Object obj=null;
ResultSet rs=null;
PreparedStatement stmt=null;
try{
stmt=conn.prepareStatement(query);
stmt.setInt(1,param);
rs = stmt.executeQuery();
if(rs.next()){
obj=rs.getObject(1);
}
}catch(SQLException e){
//catch exception and process it or log it
}finally{
rs.close();
stmt.close()
}
return obj;
}
如果您调用了OrclProc程序,那么就这样调用它
String query = "select OrclProc(?) from dual";
Object result = getResultFromStoredProcedure(query, 5);