从 Java JDBC 调用 oracle 函数

Posted

技术标签:

【中文标题】从 Java JDBC 调用 oracle 函数【英文标题】:Calling oracle function from Java JDBC 【发布时间】:2015-06-19 23:14:33 【问题描述】:

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

【问题讨论】:

这是调用 Oracle 函数的正确方法。我没有你的函数,所以我写了一个接受三个数字并返回它们的总和的函数,当我从 JDBC 调用它时它返回了正确的总和。您确定所有三个参数值都正确传递到函数中吗? 由于该函数似乎需要两个NUMBERs 和一个DATE 作为输入,因此您应该使用cstmt.setInt(2, Integer.parseInt(productNumber)); 而不是cstmt.setString(2, productNumber); 作为第一个IN 参数。或者数据库中prdmstee.prd_lvl_number%type的类型是什么? 【参考方案1】:

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

【讨论】:

以上是关于从 Java JDBC 调用 oracle 函数的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.SQLException:Io 异常:在与 oracle 的 JDBC 连接期间从读取调用中得到减一

java调用Oracle中的存储过程与存储函数

使用JDBC从Java调用Oracle SQL中的存储过程的示例

对 Oracle 存储函数的 JDBC 调用 - “结构表”类型的 IN 参数

JDBC 调用函数或存储过程

JDBC概述