Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Ошибки при создании хранимой процедуры DB2
|
|||
|---|---|---|---|
|
#18+
Приветствую. Исходные данные: стаж работы с DB2 практически отсутствует, однако появилась необходимость в создании хранимой процедуры следующего вида: Код: sql 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. В процессе написания пользовался данным документом из справочника по DB2 . Процедура получает некие значения из-вне при помощи IN параметров, курсор Mach выбирает требуемые для расчета данные из таблицы БД, затем при помощи FETCH выбранные значения помещаются в переменные, после чего производится расчет. (Запрос SQL построен так, чтобы выводить ровно 2 значения из одного столбца, то есть каждый fetch берет единственное значение из строки и передает его в переменную). Вывод посчитанного осуществляется через INSERT. Надеюсь, не запутал вас этим изложением. Проблема: при попытке ввести эту команду в Command Center (центр управления-нужная нам бд-запрос) приводит к невообразимо длинному списку ошибок: Код: sql 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. 81. 82. 83. 84. 85. 86. Что сделано: 1. Попытки изменить знак разделителя с ; на @ или даже # приводят к аналогичным ошибкам. 2. Использование командной строки (clp) с параметрами db2 -tvf c:\rnd2.txt показывает аналогичный результат (рнд2.тхт - файл, где хранится текст процедуры представленный выше). ну разве что командная строка после списка ошибок говорит, что sql команда выполнена успешна, все здорово, босс! И да, курсор mach не был открыт Собственно, текст процедуры написан в соответствии с документацией, показан знающим (не то что я) людям и в целом одобрен. Кроме того, ради эксперимента попробовал ввести заново и выполнить уже имеющиеся в бд хранимые процедуры - проблема та же - ругань на наличие end-of-statement (хотя по логике вещей, ему там самое место) итд. Условия: ============================================================ О среде инструментов управления DB2 ============================================================ Уровень инструментов управления DB2: Идентификатор продукта SQL08023 Идентификатор уровня 03040106 Уровень DB2 v8.1.10.812 Уровень компиляции s050811 PTF WR21362 ============================================================ Комплект разработки Java (JDK): Уровень IBM Corporation 1.4.1 ============================================================ Вопрос: В чем ошибка, если синтаксис процедуры написан верно? (но это опять же, я так думаю) Или я чего-то не знаю, что должен был бы... Подскажите, куда смотреть и где можно найти более полную информацию по написанию хранимок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2013, 11:43 |
|
||
|
Ошибки при создании хранимой процедуры DB2
|
|||
|---|---|---|---|
|
#18+
Shambler-AdMec, Здравствуйте. Очень много ошибок. В конце процедуры надо ставить символ разделитель (например, @), отличный от ';' и указывать, что вы его используете . В Command Center это поле Statement Termination Character внизу окна. В CLP это -td@, а не -t. Про доступные конструкции надо смотреть в зависимости от версии db2 в информационном центре для этой версии. SQL Routines для 8.2 По коду: * CONTAINS SQL заменить на READS SQL - вы используете SQL команды SELECT, INSERT. * убрать везде ':' перед именами параметров * result=f/s; trunc(result,2); Присваивания делаются в операторе SET, а не просто так. Результат trunc вообще не присваивается ничему. Наверное лучше: SET result = trunc(f/s, 2); * COMMIT Без особой надобности в процедере не надо делать, это обычно забота вызывающего приложения. Но если уж делаете, то закройте сначала курсор, а то на 'CLOSE Mach' после 'COMMIT' поймаете ошибку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2013, 15:00 |
|
||
|
Ошибки при создании хранимой процедуры DB2
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein, премного благодарен за указанные ошибки и данные вами советы. Буду осваивать и делать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2013, 16:00 |
|
||
|
Ошибки при создании хранимой процедуры DB2
|
|||
|---|---|---|---|
|
#18+
В конечном итоге получилось следующее: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Запустил через командную строку в таком виде: db2 -td@ -vf c:\rnd2.txt READS SQL выдавал ошибку и хотел вместо "BEGIN" некий токен "DATA", решил попробовать его удалить - все, процедура создалась Mark Barinstein, спасибо Вам =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2013, 10:00 |
|
||
|
Ошибки при создании хранимой процедуры DB2
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinПо коду: * CONTAINS SQL заменить на READS SQL - вы используете SQL команды SELECT, INSERT. Небольшая поправка. CONTAINS SQL заменить на MODIFIES SQL DATA (или убрать вовсе), там INSERT есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2013, 11:10 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=43&tid=1601466]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
59ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
2ms |
| others: | 281ms |
| total: | 429ms |

| 0 / 0 |
