簡體   English   中英

從Java JDBC調用oracle函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM