繁体   English   中英

从Java JDBC调用oracle函数

[英]Calling oracle function from Java 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函数的正确方法吗?

看起来你的类型不匹配。 您将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()。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM