【发布时间】: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的类型是什么?