![](/img/trans.png)
[英]Example for calling a stored procedure in Oracle SQL from Java using JDBC
[英]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.