Как заставить функцию PSQL возвращать VARCHAR[] и обрабатывать ее в JDBC?

Я пишу функцию, которая удаляет все действия для данного гига.

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, который приводит к ошибке.

a_horse_with_no_name 25.11.2022 14:18

Я предполагаю, что драйвер Java, скорее всего, вернет (скажем, с CallableStatement) ResultSet для вашего возвращаемого массива. Вам нужно будет создать массив на стороне Java

g00se 25.11.2022 14:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
93
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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);
   ...
}

В чем преимущество использования подготовленного оператора по сравнению с вызываемым оператором?

user7880305 25.11.2022 17:38

Другие вопросы по теме