从JavaJDBC调用oracle函数

从JavaJDBC调用oracle函数,java,oracle,jdbc,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

我们试图从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函数的正确方法吗?

看起来您的函数类型不匹配。您正在将out参数设置为sql整数,但随后将其作为BigDecimal获取。
如果sql函数返回整数,则使用:
callableStatement.getInt(1)

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

java和oracle类型的映射可在此处找到:


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

这是调用Oracle函数的正确方法。我没有你的函数,所以我写了一个函数,它取了三个数字并返回它们的和,当我从JDBC调用它时,它返回了正确的和。您确定所有三个参数值都正确地传递到函数中了吗?由于函数似乎期望两个
NUMBER
s和一个
DATE
作为输入,您可能应该使用
cstmt.setInt(2,Integer.parseInt(productNumber))而不是
cstmt.setString(2,产品编号)用于
参数中的第一个
。或者数据库中的
prdmstee.prd\u lvl\u number%type
的类型是什么?