2012-12-27 49 views
2

調用存儲過程我已經在postgres數據庫錯誤而從Java

create or replace function reviseTax(revisiondate date, taxrate decimal) returns   table(employeeid integer, month date, difference decimal) AS $$ 
declare 
    thisrow record; 
    newTaxAmt decimal; 
    differenceAmt decimal; 
begin 
for thisrow in select * from employee_salary where salarydate >= revisiondate loop 
    newTaxAmt = thisrow.income * $2; 
    differenceAmt = newTaxAmt - thisrow.tax; 
    update employee_salary es set tax = newTaxAmt where es.employeeid = thisrow.employeeid; 
    insert into taxrevision (employeeid , month , difference) values (thisrow.employeeid , thisrow.salarydate , differenceAmt); 

end loop; 
return query select * from taxrevision as something; 
end $$ language plpgsql; 

從數據庫中調用時能正常工作,寫了下面的存儲過程。 問題是,當我使用JDBC代碼與Java調用這個存儲過程

我的Java代碼如下

System.out.println("Enter the effective date(yyyy-mm-dd) for the tax revision"); 
dateString = scanner.next(); 
float newTaxRate = 0.3F; 

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); 
df.setLenient(false); 
java.util.Date utilDate = df.parse(dateString); 
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); 

CallableStatement callable = DBConnection.prepareCall("{call revisetax(?,?)}"); 
callable.setDate(1,sqlDate); 
callable.setFloat(2,newTaxRate); 
callable.executeQuery(); 
DBConnection.commit(); 

我收到以下錯誤:

ERROR: function revisetax(unknown, real) does not exist 
    Hint: No function matches the given name and argument types. You might need to add    explicit type casts. 
    Position: 14 

我不能弄清楚爲什麼,請幫忙!

+1

你必須使用'CallableStatement'。 – adatapost

+0

不,請試試! – codeMan

+0

親愛的jeebus,請告訴我這實際上並沒有在現實世界中進行財務計算。因爲如果它讓我知道什麼公司,所以我從不使用它們。對於任何想知道我指的是使用FLOATS – Woot4Moo

回答

0

我明白了!問題是與十進制數據類型在存儲過程中頭

create or replace function reviseTax(revisiondate date, taxrate decimal) returns   table(employeeid integer, month date, difference decimal) AS $$ 

申報

代替decimal我用real和它的工作!!

所以函數頭應該已經

create or replace function reviseTax(revisiondate date, taxrate real) returns   table(employeeid integer, month date, difference decimal) AS $$ 

聲明

附:而不是realdouble precision也適用

+1

如果你想使用十進制,那麼你必須使用\t CallableStatement的setBigDecimal(String parameterName,BigDecimal x)方法 – BevynQ

+0

Oh .. dint知道!!謝謝!!我會試驗一下。 – codeMan

2

當您調用數據庫中的存儲過程/函數時,您想使用CallableStatement對象。

CallableStatement callable = new CallableStatement("{call my_function(?)}"); 

請注意可調用語句中的花括號。

+0

我已經用CallableStatement替換了PreparedStatement,即使那時出現同樣的錯誤! :( – codeMan

+0

@codeMan請用你試過的新代碼編輯你的原始問題 – Woot4Moo

1

使用這一個

call reviseTax(?,?)