如何使用命名绑定变量调用Oracle语句并通过JDBC获取结果

时间:2016-01-30 19:04:09

标签: java oracle jdbc

我有一些旧的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。

1 个答案:

答案 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);