java - 从 Java JDBC 调用 oracle 函数

标签 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 函数的正确方法吗?

最佳答案

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

如果sql函数返回 float ,则使用 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 - 从 Java JDBC 调用 oracle 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30948592/

相关文章:

java - 无法隐藏标题栏

java - <String, Object> 或 <String, String> 的 Android HashMap

java - 组合规范并防止 NullPointerException 和 IllegalArgumentException

python - 在 Mac OS 上为 python 安装 cx_oracle

oracle - 如何在Oracle View 中添加 'WITH READ ONLY'约束

mysql - 返回至少有 2 个不同订单的员工,其中订单中某些产品的数量 >= 5

java - OSGi:如何知道 bundle 是否已更新

oracle - Oracle Apex 集合中的 ApEx 表单

java - 使用 Maven (Java) 在服务器上找不到适合 jdbc :mysql, 的驱动程序

java - 处理结果集中的空值