|
|
|
Выполнение EXECUTE BLOCK в Firebird 2.5
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток! Столкнулся с проблемой выполнения EXECUTE BLOCK с помощью интерфейса PreparedStatement. Чуть обрисую ситуацию: есть база данных под управлением Firebird 2.5, несколько таблиц , в которые необходимо вставить данные в одной транзакции, для формирования id таблиц используются специальные генераторы. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. При выполнении падает такое исключение: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. Перерыл кучу форумов и документаций, но не нашел хотя бы намека на то, в какую сторону смотреть. Понимаю, что Firebird мало где уже используется, но может кто-нибудь сталкивался с подобным и подскажет направление поисков? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 16:23 |
|
||
|
Выполнение EXECUTE BLOCK в Firebird 2.5
|
|||
|---|---|---|---|
|
#18+
Попробуйте Connection.prepareCall() и CallableStatement ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 16:32 |
|
||
|
Выполнение EXECUTE BLOCK в Firebird 2.5
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, попробовал, теперь выпадает исключение: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. Пробовал заключать сам блок в фигурные кавычки - то же самое. Программа не может распарсить строку запроса для подстановки значений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 16:50 |
|
||
|
Выполнение EXECUTE BLOCK в Firebird 2.5
|
|||
|---|---|---|---|
|
#18+
StavRazor Пробовал заключать сам блок в фигурные кавычки - то же самое. Скобки, конечно же, совсем заработался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 16:57 |
|
||
|
Выполнение EXECUTE BLOCK в Firebird 2.5
|
|||
|---|---|---|---|
|
#18+
И не распарсит то, что выходит за рамки стандарта. execute block - чисто файбердовская фича, и нет никакой гарантии, что jdbc её поддерживает, точно можно узнать только у разработчиков драйвера. Остается либо лепить sql - строку (приет инъекциям!), либо batch ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 17:05 |
|
||
|
Выполнение EXECUTE BLOCK в Firebird 2.5
|
|||
|---|---|---|---|
|
#18+
Для начала, конечно же, пример надо упростить: оставить только один insert. Потом экспериментировать. Я бы сначала убрал все параметры (поставил константы), чтобы убедиться, что по крайней мере не падаем на разборе стейтмента. Потом -- и это мое основное подозрение -- вынес бы параметры в декларацию блока. Подозреваю, параметры внутри блока не разрешены. Синтаксис ведь такой: http://firebirdsql.su/doku.php?id=execute_block EXECUTE BLOCK [ (inparam datatype = :<название параметра>, ...) ] [ RETURNS (outparam datatype, ...) } AS [DECLARE VARIABLE varparam datatype; ...] BEGIN ... END Вот все "?" вынес бы после EXECUTE BLOCK, а внутри уже обращался по именам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 17:07 |
|
||
|
Выполнение EXECUTE BLOCK в Firebird 2.5
|
|||
|---|---|---|---|
|
#18+
StavRazor, когда пишешь подобную простыню на целый скрин то неудивительно ошибаться. Если запрос сложный то воспользуйся какими-то SQL-builder-ами. Например в OracleDeveloper есть режим где можно мышкой собрать валидный текст. Или есть пакет DBMS_чево-то-там билдер. Наверное и для постгреса есть тул. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 17:30 |
|
||
|
Выполнение EXECUTE BLOCK в Firebird 2.5
|
|||
|---|---|---|---|
|
#18+
StavRazorSQL error code = -901 undefined message number[/src]Какой из вариантов jaybird и какой версии используете? Через isql (после подстановки конкретных параметров) ваш блок работает? Результат совпадает с ожидаемым? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 20:35 |
|
||
|
Выполнение EXECUTE BLOCK в Firebird 2.5
|
|||
|---|---|---|---|
|
#18+
Всем спасибо за ответы! maytonStavRazor, когда пишешь подобную простыню на целый скрин то неудивительно ошибаться. Если запрос сложный то воспользуйся какими-то SQL-builder-ами. Например в OracleDeveloper есть режим где можно мышкой собрать валидный текст. Или есть пакет DBMS_чево-то-там билдер. Наверное и для постгреса есть тул. Запрос составлял в IBExpert, там он отработал без ошибок. Ваш пост натолкнул на мысль, что, возможно, есть java-библиотеки для работы с запросами для Firebird. Поищу. Alexander A. SakДля начала, конечно же, пример надо упростить: оставить только один insert. Потом экспериментировать. Я бы сначала убрал все параметры (поставил константы), чтобы убедиться, что по крайней мере не падаем на разборе стейтмента. Потом -- и это мое основное подозрение -- вынес бы параметры в декларацию блока. Подозреваю, параметры внутри блока не разрешены. Синтаксис ведь такой: http://firebirdsql.su/doku.php?id=execute_block EXECUTE BLOCK [ (inparam datatype = :<название параметра>, ...) ] [ RETURNS (outparam datatype, ...) } AS [DECLARE VARIABLE varparam datatype; ...] BEGIN ... END Вот все "?" вынес бы после EXECUTE BLOCK, а внутри уже обращался по именам Запрос написан правильно, проверялся в IBExpert. С константами все нормально работает. Basil A. SidorovStavRazor SQL error code = -901 undefined message number[/src] Какой из вариантов jaybird и какой версии используете? Через isql (после подстановки конкретных параметров) ваш блок работает? Результат совпадает с ожидаемым? jaybird 2.2.4 от разработчиков Firebird. Через isql блок работает и результаты совпадают с ожидаемыми. ivanraИ не распарсит то, что выходит за рамки стандарта. execute block - чисто файбердовская фича, и нет никакой гарантии, что jdbc её поддерживает, точно можно узнать только у разработчиков драйвера. Остается либо лепить sql - строку (приет инъекциям!), либо batch Исходя из всего мной опробованного, только этот вариант дал положительный результат. Скорее всего действительно jaybird просто-напросто пока не поддерживает EXECUTE BLOCK. А жаль. Всем еще раз спасибо за информацию! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 09:21 |
|
||
|
Выполнение EXECUTE BLOCK в Firebird 2.5
|
|||
|---|---|---|---|
|
#18+
Что-то не увидел варианта авторВот все "?" вынес бы после EXECUTE BLOCK, а внутри уже обращался по именам. Вот тут https://groups.yahoo.com/neo/groups/Firebird-Java/conversations/topics/9416 вроде люди так делают. Правда, остановились на том, что точка с запятой в конце не нужна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 11:59 |
|
||
|
Выполнение EXECUTE BLOCK в Firebird 2.5
|
|||
|---|---|---|---|
|
#18+
Alexander A. SakЧто-то не увидел варианта авторВот все "?" вынес бы после EXECUTE BLOCK, а внутри уже обращался по именам. Вот тут https://groups.yahoo.com/neo/groups/Firebird-Java/conversations/topics/9416 вроде люди так делают. Правда, остановились на том, что точка с запятой в конце не нужна. Получилось! Спасибо большое, добрый человек! Все работает, как и должно работать. Еще раз огромное спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 19:19 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38610269&tid=2127358]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
253ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 210ms |
| total: | 541ms |

| 0 / 0 |
