Форум программистов, компьютерный форум, киберфорум
Java: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
 Аватар для maybeTM
16 / 15 / 4
Регистрация: 30.10.2014
Сообщений: 175
PostgreSQL

Как обработать несколько курсоров из хранимки?

08.06.2019, 16:33. Показов 1700. Ответов 7

Студворк — интернет-сервис помощи студентам
В общем, есть цель запилить веб сервис на спрингах. Модель взаимодействия с базой данных через orm мне не нравится и не подходит совсем.
Хотелось получать и обрабатывать данные из бд с помощью хранимок. В редких случаях бывает удобно, если хранимка возвращает несколько курсоров.
Я пытался использовать hibernate для этих целей. Получил неплохо, и всё прекрасно работает, но с одним курсором.
Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE OR REPLACE FUNCTION PUBLIC.get_goods(
    market_id bigint,
    COUNT bigint)
  RETURNS refcursor AS
$BODY$
    DECLARE
        post_goods REFCURSOR;
    BEGIN
        OPEN post_goods FOR 
            SELECT * 
            FROM goods  
            WHERE goods.marketid = market_id; 
        RETURN post_goods;
    END;
$BODY$
  LANGUAGE plpgsql VOLATILE
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    
    private static final EntityManagerFactory entityManagerFactory =
            Persistence.createEntityManagerFactory("com.market-place.db.config");
 
    private static EntityManager getEntityManager() {
        return entityManagerFactory.createEntityManager();
    }
 
    private static void getGoods(Long marketId, Long count) {
        StoredProcedureQuery query = getEntityManager().createStoredProcedureQuery("get_goods", Product.class)
                .registerStoredProcedureParameter(1, Product.class, ParameterMode.REF_CURSOR)
                .registerStoredProcedureParameter(2, Long.class, ParameterMode.IN)
                .registerStoredProcedureParameter(3, Long.class, ParameterMode.IN)
                .setParameter(2, marketId)
                .setParameter(3, count);
        List<Product> list = (List<Product>) query.getResultList();
        list.forEach(product -> System.out.println(product.toString()));
    }
Но как обработать хранимку с двумя курсорами?
Если функция принимает несколько in параметров и несколько out курсоров?
Подходит ли для таких целей hibernate, может быть есть фреймворки получше или использовать стандартный jdbc + свои велосипеды?
Может быть и не стоит использовать несколько курсоров в процедурах и ещё раз пересмотреть методы работы с бд?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.06.2019, 16:33
Ответы с готовыми решениями:

Надо сделать несколько курсоров мыши на экране
Подскажите, возможно ли реализовать такую задачу: Нужно сделать одновременно несколько курсоров мыши на экране. Расположены они к...

Как обработать несколько pictureBox в цикле?
Дано: на форме восемь PictureBox, соответственно с именами pictureBox1 ... pictureBox8. В коде есть цикл, который должен перебрать все...

как обработать несколько подключений в одно и то же время
Всем привет. Написал простенький сервер, но он почему-то не может обработать несколько соединений в раз. Вот код class...

7
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
08.06.2019, 17:03
Не стоит вообще использовать хранимые процедуры.
0
 Аватар для maybeTM
16 / 15 / 4
Регистрация: 30.10.2014
Сообщений: 175
08.06.2019, 18:25  [ТС]
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Не стоит вообще использовать хранимые процедуры.
Почему? Как тогда работать с бд?

Добавлено через 1 час 15 минут
Попытки обработать несколько курсоров
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE OR REPLACE FUNCTION public.get_goods_out_test(
    IN marketId BIGINT,
    OUT post_goods REFCURSOR,
    OUT post_markets REFCURSOR)
   AS
$BODY$
    DECLARE
    BEGIN
        OPEN post_goods FOR SELECT * FROM goods WHERE goods.marketid = marketId; 
        OPEN post_markets FOR SELECT * FROM markets;
   END;
$BODY$
  LANGUAGE plpgsql VOLATILE
Java
1
2
3
4
5
        StoredProcedureQuery storedProcedureQuery = getEntityManager().createStoredProcedureQuery("get_goods_out_test")
                .registerStoredProcedureParameter("id", Integer.class, ParameterMode.IN).setParameter("id", 4)
                .registerStoredProcedureParameter("post1", Class.class, ParameterMode.REF_CURSOR)
                .registerStoredProcedureParameter("post2", Class.class, ParameterMode.REF_CURSOR);
        storedProcedureQuery.execute();
Ловлю исключение
Code
1
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.HibernateException: PostgreSQL supports only one REF_CURSOR parameter, but multiple were registered
Значит ли это, что хибернейт не умеет в несколько курсоров?
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
08.06.2019, 18:57
orm не устраивает, поэтому буду использовать hibernate - очень логичная мысль. А вообще простой вопрос Гуглу показывает что не ты первый столкнулся с проблемой, у них баги на эту тему заведены.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
08.06.2019, 19:36
maybeTM, работать с бд как все нормальные люди. Через запросы
0
 Аватар для maybeTM
16 / 15 / 4
Регистрация: 30.10.2014
Сообщений: 175
09.06.2019, 08:31  [ТС]
Цитата Сообщение от xoraxax Посмотреть сообщение
orm не устраивает, поэтому буду использовать hibernate
В примерах я ведь не использую его орм плюшки)
Цитата Сообщение от xoraxax Посмотреть сообщение
А вообще простой вопрос Гуглу показывает что не ты первый столкнулся с проблемой, у них баги на эту тему заведены.
Видел, но там была версия 5.3 была, надеялся поправили.
Вообще гугл ещё и говорит, что hibernate не самая хорошая идея использовать. Есть другие варианты?)

Добавлено через 2 минуты
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
работать с бд как все нормальные люди. Через запросы
Разве обмазывать код приложения sql запросами - хорошая практика?)
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
09.06.2019, 09:42
Цитата Сообщение от maybeTM Посмотреть сообщение
Разве обмазывать код приложения sql запросами - хорошая практика?
плохая практика выдумывать свои термины и применять их, думая что они понятны окружающим.
Я не знаю что значит "обмазывать код sql запросами".

Добавлено через 1 минуту
Цитата Сообщение от maybeTM Посмотреть сообщение
Вообще гугл ещё и говорит, что hibernate не самая хорошая идея использовать.
там где это говорят, логично бы было поискать что предлагают в замен
Чистый хибернейт довольно сложен в настройке и не сильно удобный.
Можно использовать spring data, который намного более дружелюбен
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,777
09.06.2019, 13:23
Цитата Сообщение от maybeTM Посмотреть сообщение
Есть другие варианты?)
jOOQ
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.06.2019, 13:23
Помогаю со студенческими работами здесь

Как загрузить несколько изображений, обработать и вывести по одному?
Скрипт загружает, обрабатывает и заносит в переменную одно изображение. Затем с помощью этой переменной выводит ее на страницу, но проблема...

Как обработать несколько select одним запросом ajax?
Всем привет, имеется задача, нужно вывести предварительную сумму на основании 2х параметров. Параметры задаются в 2х или более...

Как обработать несколько элементов NumericUpDown и ComboBox в цикле?
Подскажите, возможно ли в цикле обрабатывать элементы, которые отличаются только номером? Например, у меня есть 14 comboBox и 45...

Есть функция, в прототипе которой несколько параметров перечислены через запятую. Можно ли в теле функции обработать их, как массив?
Например, double max(double x1, double x2, double x3, double x4) { int m; int i; double *a; a=&amp;x1; for (i=3, m=0; i&gt;0;...

Как считать данные с курсоров SignalExpress
Доброго! Никак не могу считать данные с курсоров в LabVIEW SignalExpress. Речь идет о: Нужно экспортировать данные с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru