2012-12-27 74 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(?,?)