Вернуть массив удаленных элементов postgresql JDBC - PullRequest
0 голосов
/ 27 мая 2020

Это моя база данных:

dragons
id, key, name, age, creation_date
users
id, name, user, pass
users_dragons
user_id, dragon_id

Итак, это мой код для удаления драконов из базы данных, у которых есть больший ключ, который был передан и принадлежит определенному пользователю. Запрос SQL отлично работает для их удаления, но не для возврата массива ключей из удаленных элементов.

Я пробовал использовать PreparedStatement, но позже я проверил, насколько мне известно, что этот класс не 't возвращают массивы, а CallableStatement предназначен только для выполнения процессов в базе данных, и я не знаю, как они возвращают массивы.

String query = "" +
"DELETE FROM dragons " +
"WHERE id IN (SELECT d.id FROM dragons d, users u, users_dragons ud" +
"         WHERE d.key > ?" +
"           AND ud.dragon_id = d.iD" +
"           AND ud.user_id in (select id from users where id = ?)) RETURNING key INTO ?";

CallableStatement callableStatement = connection.prepareCall(query);
int pointer = 0;
callableStatement.setInt(++pointer, key);
callableStatement.setInt(++pointer, credentials.id);
callableStatement.registerOutParameter(++pointer, Types.INTEGER);
callableStatement.executeUpdate();

return (int []) callableStatement.getArray(1).getArray();

Код выдает мне ошибку, но это очевидно потому что CallableStatement требует для запуска функции postgres, а не простого SQL запроса

org.postgresql.util.PSQLException: This statement does not declare an OUT parameter. 
Use { ?= call ... } to declare one. 
at org.postgresql.jdbc.PgCallableStatement.registerOutParameter
.......

Было бы очень полезно, каким будет правильный алгоритм JDB C для удаления элементов из базы данных и вернуть массив ключей удаленных элементов.

1 Ответ

1 голос
/ 27 мая 2020

Вы обрабатываете такой оператор как обычный оператор SELECT: используйте java.sql.PreparedStatement.executeQuery() или java.sql.Statement.executeQuery(String sql) для выполнения оператора и получения набора результатов.

java.sql.CallableStatement предназначен для вызова процедур (но вы не нужно в PostgreSQL).

...