Ошибка при вызове хранимой процедуры из Java
Я написал следующую хранимую процедуру в postgres
база данных
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;
Это прекрасно работает при вызове из базы данных. Проблема в том, когда я вызываю эту хранимую процедуру из Java с использованием кода JDBC
Мой код 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
Я не могу понять, почему, пожалуйста, помогите!
3 ответа
Решение
Я понял!! Проблема была с десятичным типом данных в заголовке хранимой процедуры
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 $$
объявлять
PS вместо real
, double precision
также работает
Когда вы вызываете хранимую процедуру / функцию в базе данных, вы хотите использовать CallableStatement
объект.
CallableStatement callable = new CallableStatement("{call my_function(?)}");
Обратите внимание на фигурные скобки в вызываемом утверждении.