Я пытаюсь вызвать хранимую процедуру PostgreSQL из приложения Java; процедура имеет параметр типа DATE, поэтому я использую тип java.sql.Date с CallableStatement.setDate (). Однако выполнение оператора всегда приводит к исключению, и журналы SQL показывают это:
LOG: execute <unnamed>: select * from athlete.create_athlete($1,$2,$3,$4,$5,$6,$7) as result
DETAIL: parameters: $1 = '', $2 = 'foo@bar.com', $3 = 'Joe', $4 = 'Blow', $5 = 'foobar', $6 = 'M', $7 = '1979-03-22 -04:00:00'
ERROR: column "dob" is of type date but expression is of type text at character 122
HINT: You will need to rewrite or cast the expression.
QUERY: INSERT INTO athlete.athlete (email, first_name, last_name, password, gender, dob) VALUES ( $1 , $2 , $3 , $4 , $5 , $6 )
CONTEXT: PL/pgSQL function "create_athlete" line 2 at SQL statement
STATEMENT: select * from athlete.create_athlete($1,$2,$3,$4,$5,$6,$7) as result
Хранимая процедура на самом деле имеет 6 параметров (и должна получать значения от $ 2 до $ 7 выше) - седьмое происходит от регистрации возвращаемого значения в качестве параметра out. Это меня смутило - правильно ли, что оно отображается как 7 параметров, когда я регистрирую выходной параметр для возвращаемого значения?
Из всех прочитанных мной документов у меня сложилось впечатление, что возвращаемое значение должно быть зарегистрировано в качестве первого параметра:
registerQuery = "{? = call athlete.create_athlete(?,?,?,?,?,?)}";
...
CallableStatement cs = conn.prepareCall(registerQuery);
cs.registerOutParameter(1, Types.BOOLEAN);
cs.setString(2, email);
...
Вышеприведенная ошибка подсказывает мне, что существует несоответствие между параметрами хранимой процедуры и параметрами, переданными в оператор вставки. Я следил за документацией для всего этого, но явно делал что-то не так. Как предоставить правильные параметры для хранимой процедуры и получить возвращаемое значение после вызова?