Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
Здравствуйте всем! Есть вэб-проект (Servlet, JSP), который разрабатывается на Java под WAS 6 + БД DB2 (v8.2). Дошли руки до создания хранимых процедур в БД. Хочу спросить у уважаемого сообщества, каковы будут самые идеальные ХП (для добавления, изменения, удаления записи таблицы и возвращающие выборку записей) с точки зрения оптимальности и простоты кода (SQL/SQL PL), обработки ошибок (возврата ошибок для дальнейшей обработки в приложение) и т.д? Вообщем нужен идеальный каркас в SQL/SQL PL-коде хранимых процедур insert, update, delete в таблице TAB1 и хранимой процедуры, возвращающей выборку(select *) из TAB1. Хочется увидеть простенькие примеры каркасов и обсудить, почему те или иные варианты будут лучше. Например, insert-ХП Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Заранее благодарен. С уважением, Семен Попов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2009, 17:43 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
А почему не EJB/ORM можно поинтересоваться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2009, 17:49 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
rimanА почему не EJB/ORM можно поинтересоваться?Не дорос ещё. А вообще технология и иерархия данных, реализованные и используемые в моем приложении, позволяют обойтись без EJB/ORM. Хотя, насколько это всё корректно, судить не решаюсь. Но суть не в этом. Даже с EJB/ORM иногда приходится использовать ХП. Для себя ставлю задачу определить общие (предусматривающие основные моменты) каркасы(шаблоны) для хранимых процедур (insert, update, delete, select) по одной таблице, чтобы при создании новых проектов не думать об их решении. Я понимаю, что случаи бывают разными для разных приложений, но задаю вопрос для самого простого варианта. Может какой-то план тела процедуры для себя определить, что-то вроде: 1. Декларация переменных 2. Открытие транзакции 3. Выполнение скрипта(insert, update, delete) 4. Закрытие транзакции 5. Обработка ошибок и т.д. А лучше кодом SQL PL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2009, 09:36 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
Semen Popov, п.4 - спорно, в общем случае транзакцию закрывать в ХП не нужно. Как пример, кроме записи в основную таблицу бывает необходимо выполнить запись во вспомогательные таблицы. На мой взгляд, главное выработать концепцию, чтобы в дальнейшем не вспоминать, закрывается транзакция в ХП или нет. Решать Вам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2009, 10:22 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
Vladimir Kiselev п.4 - спорно, в общем случае транзакцию закрывать в ХП не нужно. Как пример, кроме записи в основную таблицу бывает необходимо выполнить запись во вспомогательные таблицы. На мой взгляд, главное выработать концепцию, чтобы в дальнейшем не вспоминать, закрывается транзакция в ХП или нет. Решать Вам.Спасибо. Но вот в простом случае, когда выполняется скрипт по одной таблице, а она никуда "не лезет" (записи во вспомогательные таблицы не выполняются, триггеров нет), каков будет план? Или уточню: есть таблица MYTAB (RECID integer generated always as identity, FLD1, FLD2,... c primary key (RECID) и unique key(FLD1)). Насколько будет полноценен скрипт Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. В процедуре предусмотрен возврат количества обработанных записей. Я узнаю, была ли добавлена запись. А смогу ли в приложении узнать, какая ошибка возникла (если возникла), и затем передать код ошибки и ее описание пользователю? Например, произошло дублирование записи по unique key. Хотелось бы сообщить пользователю ошибку и выдать конфликтный объект БД с его описанием (комментарием). Что в этой ХП нужно максимально предусмотреть, чтобы с ней было легко работать из приложения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2009, 11:12 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
Semen PopovЧто в этой ХП нужно максимально предусмотреть, чтобы с ней было легко работать из приложения?Чтобы процедура была оптимальной, информативной и ещё что-нибудь предусмотреть, о чём я еще не знаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2009, 11:19 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
Semen PopovЗдравствуйте всем! Есть вэб-проект (Servlet, JSP), который разрабатывается на Java под WAS 6 + БД DB2 (v8.2). Дошли руки до создания хранимых процедур в БД. При программировании на Java хранимые процедуры для этих целей не используют. ХП это тяжелая артиллерия для решения сложных задач, где Java неудобна или приводит к проблемам с производительностью. Для простых операций в Java принято использовать ORM. Он решает поставленные Вами задачи быстро как в плане скорости выполнения, так и в плане скорости разработки. И он обеспечивает Вам автоматом привычный в Java объектный подход. На мой взгляд в вашем случае было бы правильнее выбрать подходящий ORM. Вот тут есть сравнение: http://terrazadearavaca.blogspot.com/2008/12/jpa-implementations-comparison.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2009, 13:20 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
шубин_дуПри программировании на Java хранимые процедуры для этих целей не используют. ХП это тяжелая артиллерия для решения сложных задач, где Java неудобна или приводит к проблемам с производительностью. Для простых операций в Java принято использовать ORM. Он решает поставленные Вами задачи быстро как в плане скорости выполнения, так и в плане скорости разработки. И он обеспечивает Вам автоматом привычный в Java объектный подход. На мой взгляд в вашем случае было бы правильнее выбрать подходящий ORM. Вот тут есть сравнение: http://terrazadearavaca.blogspot.com/2008/12/jpa-implementations-comparison.htmlСпасибо. Я понимаю ситуацию так. В той реализации, что сейчас имею, у меня есть два варианта выполнения скриптов - через PrepareStatement и PrepareCall. Выполнение скрипта с помощью PrepareStatement - это динамический SQL. На выполнение динамического скрипта DB2 затрачивает ресурсы - разбор скрипта, проверка синтаксиса и т.д. И это при каждом выполнении скрипта, а таких операций проводится много. Если эти скрипты вынести в хранимые процедуры, то DB2 их будет видеть как свой скомпилированный код, поэтому при их вызове не будет затрачивать дополнительные ресурсы. Слышал, что некоторые ребятишки-программисты рекомендуют часто используемый скрипт выносить в ХП. Вот и спрашиваю, как сделать ХП оптимальной для этих скриптов. Если неправильно рассуждаю, то поправьте меня. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2009, 16:05 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
Semen Popovшубин_дуПри программировании на Java хранимые процедуры для этих целей не используют. ХП это тяжелая артиллерия для решения сложных задач, где Java неудобна или приводит к проблемам с производительностью. Для простых операций в Java принято использовать ORM. Он решает поставленные Вами задачи быстро как в плане скорости выполнения, так и в плане скорости разработки. И он обеспечивает Вам автоматом привычный в Java объектный подход. На мой взгляд в вашем случае было бы правильнее выбрать подходящий ORM. Вот тут есть сравнение: http://terrazadearavaca.blogspot.com/2008/12/jpa-implementations-comparison.htmlСпасибо. Я понимаю ситуацию так. В той реализации, что сейчас имею, у меня есть два варианта выполнения скриптов - через PrepareStatement и PrepareCall. Выполнение скрипта с помощью PrepareStatement - это динамический SQL. На выполнение динамического скрипта DB2 затрачивает ресурсы - разбор скрипта, проверка синтаксиса и т.д. И это при каждом выполнении скрипта, а таких операций проводится много. Если эти скрипты вынести в хранимые процедуры, то DB2 их будет видеть как свой скомпилированный код, поэтому при их вызове не будет затрачивать дополнительные ресурсы. Слышал, что некоторые ребятишки-программисты рекомендуют часто используемый скрипт выносить в ХП. Вот и спрашиваю, как сделать ХП оптимальной для этих скриптов. Если неправильно рассуждаю, то поправьте меня. Все верно, ресурсы затрачиваются. И если динамический SQL очень большой и сложный и его нет в кеше, то на разбор будут тратиться секунды. Но если он маленький и простой и он в кеше, то на разбор будут тратиться микросекунды. Сделайте бенчмарк и подтвердите свои опасения. Я уверен на 100%, что разницы никакой не будет. Тест очень простой: 1. 1000 инсертов при помощи вызова хранимой процедуры 2. 1000 инсертов через JPA. Точнее это будут уже не инсерты, а new MyClass(), save. Инсерты сгенерит JPA. 1. 1000 селектов при помощи вызова хранимой процедуры 2. 1000 селектов через JPA. Точнее это будут object.get(). Селекты сгенерит JPA. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2009, 19:25 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
Понятно. Спасибо. Будем развиваться, будем использовать. Но по ХП всё-таки разъясните или покажите, пожалуйста. Хотя бы в части информативности. Что изменить в приведённой мною процедуре, чтобы получать информацию о возникших ошибках? А то сейчас не могу узнать, какая ошибка произошла (нарушена уникальность, не вылонено ограничение по полю и т.д.). get diagnostics сейчас возвращает только количество обработанных строк. Другие параметры get diagnostics могут мне помочь? Может стоит использовать другой оператор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2009, 11:20 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
Semen PopovЧто изменить в приведённой мною процедуре, чтобы получать информацию о возникших ошибках? А то сейчас не могу узнать, какая ошибка произошла (нарушена уникальность, не вылонено ограничение по полю и т.д.). get diagnostics сейчас возвращает только количество обработанных строк. Другие параметры get diagnostics могут мне помочь? Может стоит использовать другой оператор? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2009, 13:35 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein, спасибо. Но MESSAGE_TEXT хотя и довольно полное сообщение, не указывает имена проблемных объектов. Потестировал ваш код на таблице с уникальным ключом и получил сообщение: Одно или несколько значений в операторе INSERT, в операторе UPDATE или при обновлении внешнего ключа, вызванном оператором DELETE, недопустимы, поскольку первичный ключ, ограничение уникальности или индекс уникальности "2" запрещают повторение строк для этих столбцов в таблице "TESTDB.MYTAB" Тут, возможно, надо покопать и другие параметры информационной области диагностики - CONSTRAINT_NAME, COLUMN_NAME, CURSOR_NAME, PARAMETR_NAME, TRIGGER_NAME и другие. Отлавливать хэндлером нужные SQLSTATE и самому генерировать сообщение об ошибке. Примерно так можно отловить нарушение уникальности и вытащить имя unique-констраинта: Код: plaintext 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. Если предусмотреть в ХП хэндлеры для часто возникаемых ошибок, то для них можно расширить сообщение об ошибке и дополнить нужной информацией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2009, 10:03 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
Semen PopovТут, возможно, надо покопать и другие параметры информационной области диагностики - CONSTRAINT_NAME, COLUMN_NAME, CURSOR_NAME, PARAMETR_NAME, TRIGGER_NAME и другие.db2 for LUW (в т.ч. ваша db2 v8.2) и db2 for iOS - это 2 разные db2. GET DIAGNOSTICS для db2 for LUW не имеет таких ключевых слов. Для "очеловечивания" SQLSTATE 23505 можно так: create procedure ... Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2009, 11:09 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
Потестил. У меня почему-то этот параметр DB2_TOKEN_STRING возвращает скудную информацию Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Тело процедуры: create procedure ... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 12:46 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
Semen PopovПотестил. У меня почему-то этот параметр DB2_TOKEN_STRING возвращает скудную информацию Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 2 лексемы (номер индекса, полное имя таблицы), разделенные символом x'FF'. Я не зря в соём коде привёл пример, как вытащить из этой строки нужную информацию для запроса на имя уникального индекса.Semen PopovИнтересно, что значение параметра OU_SQLSTTE не возвращается. Тело процедуры: create procedure ... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Поэтому, чтобы получить одновременно и SQLCODE и SQLSTATE, вам надо это сделать одной командой сразу после get diagnostics , например, так: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 13:11 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
Понятно. Большое спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 14:08 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
Маленький итог темы в части информативности: Хранимая процедура с получением подробного отчета об ошибке Код: plaintext 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. Замечания: 1. Использование хендлеров в ХП не дает возможности передачи возникшего исключения в приложение. Поэтому, если в java-приложении предусмотрен перехват исключения (вызов процедуры в конструкции try {} catch ();), то он срабатывать не будет. Обработать ошибки отдельных SQLSTATE в java-приложении нужно будет по возвращаемому параметру ou_SQLSTTE. 2. Было бы разумно вынести обработку ошибок в отдельную процедуру для того, чтобы не повторять его в каждой ХП. Возможно ли это реализовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 16:29 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
Semen PopovЗамечания: 1. Использование хендлеров в ХП не дает возможности передачи возникшего исключения в приложение. Поэтому, если в java-приложении предусмотрен перехват исключения (вызов процедуры в конструкции try {} catch ();), то он срабатывать не будет. Обработать ошибки отдельных SQLSTATE в java-приложении нужно будет по возвращаемому параметру ou_SQLSTTE. 2. Было бы разумно вынести обработку ошибок в отдельную процедуру для того, чтобы не повторять его в каждой ХП. Возможно ли это реализовать?Можете вынести обработку ошибок в свою собственную процедуру. Передавайте туда sqlcode, sqlstate, db2_token_string из handler'а процедуры, вызвавшей ошибку. Кроме того, можете также вызывать SIGNAL / RESIGNAL команды в процедуре-обработчике, если хочется сформировать своё сообщение и выкинуть его вместе с ошибкой приложению. Только текст такого сообщения будет не более 70 символов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 17:18 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinМожете вынести обработку ошибок в свою собственную процедуру. Передавайте туда sqlcode, sqlstate, db2_token_string из handler'а процедуры, вызвавшей ошибку.Спасибо. А ещё более удобней было бы вынести весь код (декларацию хендлеров и обработку) в SQL-рутину. В DB2 v8.2 поддерживаются SQL-routines? Тогда бы вообще не пришлось в головных процедурах декларировать объекты, связанные с обработкой ошибок. Я правильно понимаю SQL-routine? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2009, 09:48 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
Semen PopovВ DB2 v8.2 поддерживаются SQL-routines?Да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2009, 10:03 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
Скорее, они не помогут. Наверно, я неправильно понимаю SQL routine. В моем программистском понимании рутина - это фрагмент часто используемого кода, вынесенный из тела процедуры. В процедуре в нужных местах лишь подставляется её имя. Это указывает компилятору, чтобы тот вставил фрагмент кода. Подобное можно реализовать в DB2? А то мы вроде обработку ошибок выносим в отдельную процедуру, но не полностью. Декларацию хендлеров, системных переменных и т.д. все равно нужно делать в каждой ХП. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2009, 11:25 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
Semen PopovА то мы вроде обработку ошибок выносим в отдельную процедуру, но не полностью. Декларацию хендлеров, системных переменных и т.д. все равно нужно делать в каждой ХП.Это вас сильно напрягает? Это ведь маленький кусочек кода в каждой процедуре... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2009, 12:08 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinЭто вас сильно напрягает? Это ведь маленький кусочек кода в каждой процедуре...В принципе нет. Но как то не красиво получается - некоторая зависимость функционала обработки ошибок от ХП. Было б хорошо реализовать обработчик, который всё делал сам - и исключения отлавливал, и разбор ошибки и составление сообщения. Ну, да ладно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2009, 13:51 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
Добрый день. Никак не могу понять!!! Есть ХП с входным параметром IN param INTEGER. На основе этого параметра мне надо создать курсор. Т.е. так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Как я понял сначало надо DECLARE, а потом уже что-то делать. Как тут можно сделать!? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2009, 07:03 |
|
||
|
Java и идеальные ХП
|
|||
|---|---|---|---|
|
#18+
НиколахаДобрый день. Никак не могу понять!!! Есть ХП с входным параметром IN param INTEGER. На основе этого параметра мне надо создать курсор. Т.е. так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Как я понял сначало надо DECLARE, а потом уже что-то делать. Как тут можно сделать!? Compound SQL (Procedure) statement . Обратите внимание, что порядок следования команд внутри compound statement такой: 1. декларация переменных 2. декларация курсоров 3. SQL Procedure statement А у вас сначала 3, потом 2. Так нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2009, 09:48 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=35913621&tid=1603322]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
55ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
| others: | 200ms |
| total: | 352ms |

| 0 / 0 |
