我们正在尝试从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函数的正确方法吗?
答案 0 :(得分:0)
看起来你的类型不匹配。您将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()。