从Java JDBC调用oracle函数

时间:2015-06-19 23:14:33

标签: java oracle jdbc

我们正在尝试从JDBC调用Oracle函数。它需要3个输入(字符串,数字和日期)并返回1个数字:

create or replace function     mww_avgcost
(in_prd_lvl_number prdmstee.prd_lvl_number%type,
in_org_lvl_number orgmstee.org_lvl_number%type,
in_sales_date     prcmstee.prc_from_date%type)
RETURN NUMBER
AS
begin   

使用Java JDBC代码如下:

        String call = "{ ? = call PMM.MWW_AVGCOST(?, ?, ?) }";
        CallableStatement cstmt = conn.prepareCall(call);
        cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
        cstmt.setString(2, productNumber);
        cstmt.setInt(3, storeNumber);

        // convert XML input to SQL date
        java.sql.Date sqlDate = new java.sql.Date(saleDate.toGregorianCalendar().getTimeInMillis());

        cstmt.setDate(4, sqlDate);
        cstmt.execute();
        BigDecimal resultFromFunction = cstmt.getBigDecimal(1);
        log.info("resultFromFunction:" + resultFromFunction);

结果总是返回1而不是正确的数字。我们已经从SQL Developer运行它与相同的参数,它看起来很好。这是从JDBC调用SQL函数的正确方法吗?

1 个答案:

答案 0 :(得分:0)

看起来你的类型不匹配。您将out参数设置为sql整数,然后将其设置为BigDecimal 如果sql函数返回一个整数,则使用:callableStatement.getInt(1)

如果sql函数返回浮点数,则使用 callableStatement.registerOutParameter(1, java.sql.Types.DOUBLE)callableStatement.getDouble(1)

可以在此处找到java和oracle类型的映射:https://docs.oracle.com/javase/1.5.0/docs/guide/jdbc/getstart/mapping.html

如果由于舍入问题或其他原因确实需要BigDecimal,那么你的sql函数应该返回DECIMAL或NUMERIC。你应该像现在一样设置out参数和getBigDecimal()。