Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC - ExecuteQuery для запуска процедуры / 24 сообщений из 24, страница 1 из 1
20.09.2016, 18:44
    #39312197
lsandry
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
Коллеги.

Нужно решение, чтобы обойти ограничения ExecuteQuery и через этот механизм запустить процедуру (оракловую).
Из приложения есть доступ по JDBC для отчетов и единстенный доступный метод ExecuteQuery.

Нужно перед выполнением отчета передать управление процедуре, передва ей параметр для заполнения временной таблицы.

Повесить триггер не получилось.
Сформировать строчку, чтобы передать на вход ExecuteQuery корректно тоже не смог (ну и не смогу "в лоб")

Спасибо.

З.Ы. Варианты использовать Execute или ExecuteUpdate не предлагайте. Была бы возможность, не было бы вопроса.
...
Рейтинг: 0 / 0
20.09.2016, 18:47
    #39312199
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
lsandry,

Можно создать функцию и дёрнуть её через SELECT, а функцией делегировать вызов хранимки.
...
Рейтинг: 0 / 0
20.09.2016, 18:50
    #39312206
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
В 12-ом Oracle вроде можно. Где-то был пример в подфоруме Oracle.

До 12-ого, как предложил Blazkowicz.
...
Рейтинг: 0 / 0
20.09.2016, 18:53
    #39312208
lsandry
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
Blazkowicz

Спасибо
Направление понял но пока не нагуглил решение.

Если можно, ткни пальцем как?
DBMS_EXECUTE в функции?
...
Рейтинг: 0 / 0
20.09.2016, 19:04
    #39312220
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
lsandryDBMS_EXECUTE в функции?
Нафига какой-то DBMS_EXECUTE ?
Код: plsql
1.
2.
3.
4.
5.
function my_function() return number is
begin
  procedure(.....);
  return 0;
end;



Разумеется, если внутри вызываемой процедуры нет COMMIT'а/ROLLBACK'а. Если есть COMMIT/ROLLBACK - читать про автономные транзакции IMHO
...
Рейтинг: 0 / 0
20.09.2016, 19:05
    #39312221
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
lsandry,

Да, вроде, просто имя процедуры. Если есть параметры, то их в скобки.
...
Рейтинг: 0 / 0
20.09.2016, 21:10
    #39312284
lsandry
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
Коммиты есть :(
Заполнение временной таблицы. Так как непонятно что с сессиями, на всякий случай коммичу.

Оракл 10 и 11.
Не 12.

Если я все правильно понимаю, то только автономные транзакции?
Или еще есть варианты чтобы попробовать?
...
Рейтинг: 0 / 0
20.09.2016, 23:22
    #39312324
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
lsandryТак как непонятно что с сессиями
когда вызовут два отчёта одновременно, тогда может Иванов получить отчет Петрова.
Пробуйте без временных таблиц.
Ну или отчёт при запуске САМ готовит себе данные.
Или....
...
Рейтинг: 0 / 0
21.09.2016, 07:03
    #39312356
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
Petro123, я конечно сейчас пьян, но лично я вообще не понял, что ты имеешь в виду.
...
Рейтинг: 0 / 0
21.09.2016, 10:04
    #39312474
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
lsandryИз приложения есть доступ по JDBC для отчетов и единстенный доступный метод ExecuteQuery.

А CallableStatement почему нельзя?
...
Рейтинг: 0 / 0
21.09.2016, 10:05
    #39312476
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
Leonid Kudryavtsev,
))
Каждый работает в своей сессии чтобы данные и запросы не пересекались.
За этим следит СУБД+JDBC.
Оптимально чтобы сам отчётник в одной сессии при запуске всё собирал и вызывал.
Отсюда следует, что транзакции длинные и коммиты не нужны + временная табла на сессию (после закрытия уничтожается СУБД).
Но лучше без временной, а одним мега большим запросом.
ТС не сказал, что у него почему то не получилось одним запросом без процедуры.
А такие ограничения лучше сразу писать в начале топика.
...
Рейтинг: 0 / 0
21.09.2016, 10:10
    #39312482
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
Сергей АрсеньевА CallableStatement почему нельзя?
Потому что он JDBC на прямую не использует, а скармливает запрос в отчет, который делает executeQuery().
...
Рейтинг: 0 / 0
21.09.2016, 10:11
    #39312483
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
Petro123Но лучше без временной, а одним мега большим запросом.
Может человеку надо 10 разных отчетов по одной временной табличке?
Десять раз ее формировать? Да еще и согласованные на один момент времени?
Можно, конечно, но лучше не будет. :)
...
Рейтинг: 0 / 0
21.09.2016, 10:16
    #39312488
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
Blazkowicz,

Ну тогда, Petro прав и надо переделать отчет, чтоб без временной таблички. Долго наверное будет... :)
...
Рейтинг: 0 / 0
21.09.2016, 10:18
    #39312490
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
Сергей АрсеньевМожет человеку надо 10 разных отчетов по одной временной табличке?
может. Но это уже оптимизация Подсистемы отчётов.
Зачем гадать.
...
Рейтинг: 0 / 0
21.09.2016, 12:14
    #39312592
lsandry
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
Спасиб всем.
Читаю про автономные транзакции.

Сорри что сразу описал все по минимуму. Не хотел грузить лишними данными.

Процедура генерит данные по ключу (параметру), который передается на вход процедуре, поэтому если Вася и Петя просят отчет по разным ключам (параметрам) - они получат свои данные вне зависимости от времени выполнения отчета.
Процедура первым делом чистит таблицу по своему ключу, дабы данные не задваивались и удалить неактуальную инфу.
Если ключи совпадут (отчет по одним и тем же данным) - ну тогда круто. Оба пользователя получат оба свои данные.
Есть шанс первому - получить неполные данные (либо пустые) но не думаю что это проблема. Пнет отчет повторно, раз такой "счастливый".

Про варианты вызова - да, абсолютно правильно. Я кормлю запрос репорт серверу, который возвращет мне отчет.
Но сервер использует запрос ExecuteQuery, для получения данных, который не позволяет пинать процедуры и запросы так как мне нужно.
Перелопачивать архитектуру для добавления одного отчета, в ущерб надежности и стандартизации - желания нет.
...
Рейтинг: 0 / 0
21.09.2016, 12:34
    #39312623
Dmitry.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
Код: sql
1.
2.
3.
4.
5.
6.
7.
function my_function() return number is
  pragma autonomous_transaction;
begin
  procedure(.....);
  commit;
  return 0;
end;
...
Рейтинг: 0 / 0
21.09.2016, 15:08
    #39312755
lsandry
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
Спасибо всем.

Чуть не так как написал Dmitry у меня заработало.
Вариант Дмитрия не тестил.
...
Рейтинг: 0 / 0
21.09.2016, 16:45
    #39312860
just_vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
Может быть я не очень понимаю чего хочется ТС, но разве не поможет:
stmt.executeQuery("SELECT PROCEDURE_NAME() FROM DUAL");
...
Рейтинг: 0 / 0
21.09.2016, 20:54
    #39312978
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
just_vladimirМожет быть я не очень понимаю чего хочется ТС, но разве не поможет:
stmt.executeQuery("SELECT PROCEDURE_NAME() FROM DUAL");
Тогда это должна быть не процедура, а функция )))
...
Рейтинг: 0 / 0
21.09.2016, 21:47
    #39312995
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
lsandryПерелопачивать архитектуру для добавления одного отчета, в ущерб надежности и стандартизации - желания нет.
только не надо лабуду какую то писать.
Был задан вопрос - что такого делает процедура чего нельзя получить боооольшим запросом?
Ходит курсором по строкам и перебрасывает из одной ячейки во временную таблу?
...
А уже после ответа можно и решать про надежность и стандартизацию и велосипед.
...
Рейтинг: 0 / 0
21.09.2016, 21:49
    #39312996
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
lsandryЧитаю про автономные транзакции.
автономные применяют в триггерах для логирования.
Чтобы при откате транзакции, запись в логах всё таки осталась.
...
Рейтинг: 0 / 0
22.09.2016, 10:16
    #39313171
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
Petro123автономные применяют в триггерах для логирования.
А так же и для того, чтоб select мог изменить данные. :)
Ибо Оракул считает, что "ORA-14551: cannot perform a DML operation inside a query"
...
Рейтинг: 0 / 0
22.09.2016, 10:30
    #39313187
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC - ExecuteQuery для запуска процедуры
Petro123Был задан вопрос - что такого делает процедура чего нельзя получить боооольшим запросом?

Может у TC отчет, что-то типа jasper report. Который состоит из иерархии отчетов. И что-бы на каждом новом уровне не гонять заного этот большой запрос, иногда, проще засунуть результат во временную.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC - ExecuteQuery для запуска процедуры / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]