|
|
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
Коллеги. Нужно решение, чтобы обойти ограничения ExecuteQuery и через этот механизм запустить процедуру (оракловую). Из приложения есть доступ по JDBC для отчетов и единстенный доступный метод ExecuteQuery. Нужно перед выполнением отчета передать управление процедуре, передва ей параметр для заполнения временной таблицы. Повесить триггер не получилось. Сформировать строчку, чтобы передать на вход ExecuteQuery корректно тоже не смог (ну и не смогу "в лоб") Спасибо. З.Ы. Варианты использовать Execute или ExecuteUpdate не предлагайте. Была бы возможность, не было бы вопроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2016, 18:44 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
lsandry, Можно создать функцию и дёрнуть её через SELECT, а функцией делегировать вызов хранимки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2016, 18:47 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
В 12-ом Oracle вроде можно. Где-то был пример в подфоруме Oracle. До 12-ого, как предложил Blazkowicz. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2016, 18:50 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Спасибо Направление понял но пока не нагуглил решение. Если можно, ткни пальцем как? DBMS_EXECUTE в функции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2016, 18:53 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
lsandryDBMS_EXECUTE в функции? Нафига какой-то DBMS_EXECUTE ? Код: plsql 1. 2. 3. 4. 5. Разумеется, если внутри вызываемой процедуры нет COMMIT'а/ROLLBACK'а. Если есть COMMIT/ROLLBACK - читать про автономные транзакции IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2016, 19:04 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
lsandry, Да, вроде, просто имя процедуры. Если есть параметры, то их в скобки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2016, 19:05 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
Коммиты есть :( Заполнение временной таблицы. Так как непонятно что с сессиями, на всякий случай коммичу. Оракл 10 и 11. Не 12. Если я все правильно понимаю, то только автономные транзакции? Или еще есть варианты чтобы попробовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2016, 21:10 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
lsandryТак как непонятно что с сессиями когда вызовут два отчёта одновременно, тогда может Иванов получить отчет Петрова. Пробуйте без временных таблиц. Ну или отчёт при запуске САМ готовит себе данные. Или.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2016, 23:22 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
Petro123, я конечно сейчас пьян, но лично я вообще не понял, что ты имеешь в виду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2016, 07:03 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
lsandryИз приложения есть доступ по JDBC для отчетов и единстенный доступный метод ExecuteQuery. А CallableStatement почему нельзя? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2016, 10:04 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, )) Каждый работает в своей сессии чтобы данные и запросы не пересекались. За этим следит СУБД+JDBC. Оптимально чтобы сам отчётник в одной сессии при запуске всё собирал и вызывал. Отсюда следует, что транзакции длинные и коммиты не нужны + временная табла на сессию (после закрытия уничтожается СУБД). Но лучше без временной, а одним мега большим запросом. ТС не сказал, что у него почему то не получилось одним запросом без процедуры. А такие ограничения лучше сразу писать в начале топика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2016, 10:05 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевА CallableStatement почему нельзя? Потому что он JDBC на прямую не использует, а скармливает запрос в отчет, который делает executeQuery(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2016, 10:10 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
Petro123Но лучше без временной, а одним мега большим запросом. Может человеку надо 10 разных отчетов по одной временной табличке? Десять раз ее формировать? Да еще и согласованные на один момент времени? Можно, конечно, но лучше не будет. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2016, 10:11 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Ну тогда, Petro прав и надо переделать отчет, чтоб без временной таблички. Долго наверное будет... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2016, 10:16 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевМожет человеку надо 10 разных отчетов по одной временной табличке? может. Но это уже оптимизация Подсистемы отчётов. Зачем гадать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2016, 10:18 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
Спасиб всем. Читаю про автономные транзакции. Сорри что сразу описал все по минимуму. Не хотел грузить лишними данными. Процедура генерит данные по ключу (параметру), который передается на вход процедуре, поэтому если Вася и Петя просят отчет по разным ключам (параметрам) - они получат свои данные вне зависимости от времени выполнения отчета. Процедура первым делом чистит таблицу по своему ключу, дабы данные не задваивались и удалить неактуальную инфу. Если ключи совпадут (отчет по одним и тем же данным) - ну тогда круто. Оба пользователя получат оба свои данные. Есть шанс первому - получить неполные данные (либо пустые) но не думаю что это проблема. Пнет отчет повторно, раз такой "счастливый". Про варианты вызова - да, абсолютно правильно. Я кормлю запрос репорт серверу, который возвращет мне отчет. Но сервер использует запрос ExecuteQuery, для получения данных, который не позволяет пинать процедуры и запросы так как мне нужно. Перелопачивать архитектуру для добавления одного отчета, в ущерб надежности и стандартизации - желания нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2016, 12:14 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2016, 12:34 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
Спасибо всем. Чуть не так как написал Dmitry у меня заработало. Вариант Дмитрия не тестил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2016, 15:08 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
Может быть я не очень понимаю чего хочется ТС, но разве не поможет: stmt.executeQuery("SELECT PROCEDURE_NAME() FROM DUAL"); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2016, 16:45 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
just_vladimirМожет быть я не очень понимаю чего хочется ТС, но разве не поможет: stmt.executeQuery("SELECT PROCEDURE_NAME() FROM DUAL"); Тогда это должна быть не процедура, а функция ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2016, 20:54 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
lsandryПерелопачивать архитектуру для добавления одного отчета, в ущерб надежности и стандартизации - желания нет. только не надо лабуду какую то писать. Был задан вопрос - что такого делает процедура чего нельзя получить боооольшим запросом? Ходит курсором по строкам и перебрасывает из одной ячейки во временную таблу? ... А уже после ответа можно и решать про надежность и стандартизацию и велосипед. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2016, 21:47 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
lsandryЧитаю про автономные транзакции. автономные применяют в триггерах для логирования. Чтобы при откате транзакции, запись в логах всё таки осталась. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2016, 21:49 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
Petro123автономные применяют в триггерах для логирования. А так же и для того, чтоб select мог изменить данные. :) Ибо Оракул считает, что "ORA-14551: cannot perform a DML operation inside a query" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2016, 10:16 |
|
||
|
JDBC - ExecuteQuery для запуска процедуры
|
|||
|---|---|---|---|
|
#18+
Petro123Был задан вопрос - что такого делает процедура чего нельзя получить боооольшим запросом? Может у TC отчет, что-то типа jasper report. Который состоит из иерархии отчетов. И что-бы на каждом новом уровне не гонять заного этот большой запрос, иногда, проще засунуть результат во временную. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2016, 10:30 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39312197&tid=2123692]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
63ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 395ms |

| 0 / 0 |
