Я пишу функцию, которая удаляет все действия для данного гига.
CREATE OR REPLACE FUNCTION removeAllActsFromGig(gGigId INTEGER) RETURNS VARCHAR[]
Он должен вернуть все имена клиентов, затронутых этой отменой, и установить стоимость их билетов равной 0.
Есть таблица тикетов с полями gigID, CustomerName и cost.
Я объявил массив VARCHAR a и пытаюсь вставить результат приведенного ниже запроса в массив и вернуть его.
a VARCHAR[]
UPDATE ticket SET Cost = 0 WHERE gigID = gGigID RETURNING CustomerName INTO a;
На уровне обработки в Java я хотел бы привести массив, возвращаемый как массив строк. Об этом есть некоторая документация, например: Использование объектов массива
Вот соответствующий код JDBC:
removeAllActsFromGig = conn.prepareCall("{? = call removeAllActsFromGig(?) }");
removeAllActsFromGig.registerOutParameter(1, java.sql.Types.ARRAY);
removeAllActsFromGig.setInt(2, gigID);
removeAllActsFromGig.execute();
String[] result = (String[])removeAllActsFromGig.getArray(1);
Однако при попытке привести результат я получаю сообщение об ошибке
java.sql.Array cannot be converted to java.lang.String[]
У кого-нибудь есть идеи о том, что я могу сделать?
Я предполагаю, что драйвер Java, скорее всего, вернет (скажем, с CallableStatement
) ResultSet
для вашего возвращаемого массива. Вам нужно будет создать массив на стороне Java
getArray()
возвращает java.sql.Array
, а не массив Java. Вы должны вызвать getArray()
в этом экземпляре. Результат этого можно преобразовать в массив Java.
java.sql.Array array = removeAllActsFromGig.getArray(1);
String[] result = (String[])array.getArray();
Вам также не нужен CallableStatement для использования функции Postgres. Старый добрый PreparedStatement и executeQuery()
будут отлично работать.
PreparedStatement removeAllActsFromGig =
conn.prepareStatement("select removeAllActsFromGig(?)");
removeAllActsFromGig.setInt(1, gigID);
ResultSet rs = removeAllActsFromGig.executeQuery();
if (rs.next()) {
Array array = rs.getArray(1);
...
}
В чем преимущество использования подготовленного оператора по сравнению с вызываемым оператором?
Пожалуйста, отредактируйте свой вопрос и добавьте код Java, который приводит к ошибке.