Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Проблема с записью даты в хранимой процедуре !
|
|||
|---|---|---|---|
|
#18+
Добрый день, уважаемые эксперты. В хранимой процедуре в DB2 версия 8.2 столкнулись с проблемой записи текущей даты и времени, подскажите, пожалуйста. Кусок процедуры Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. В одной и той же процедуре в зависимости от разных условий производится либо Insert, либо Update в одной и той же таблице. Параметр dt сделан выходным параметром в процедуре. В случае Insert все работает корректно. В случае Update в таблицу записывается NULL и параметр dt возвращает из процедуры "14.09.;310 21:18:05". Как такое может быть? Параметр dt больше нигде не изменяется после записи SET dt=CURRENT TIMESTAMP ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2009, 17:22 |
|
||
|
Проблема с записью даты в хранимой процедуре !
|
|||
|---|---|---|---|
|
#18+
Challenger, Добрый день. А нет ли в таблице tbTest поля с именем dt? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2009, 17:30 |
|
||
|
Проблема с записью даты в хранимой процедуре !
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein, нету Вот привожу конкретные данные, а не абстрактный тестовый пример Параметр @CUR_TIMESTAMP на который обращаем внимание это таблица Код: 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. это процедура Код: 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. 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. 87. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2009, 17:36 |
|
||
|
Проблема с записью даты в хранимой процедуре !
|
|||
|---|---|---|---|
|
#18+
т.е. вы хотите сказать, что остальные поля этим update обновляются, а DATE_OF_INSERT - нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2009, 18:19 |
|
||
|
Проблема с записью даты в хранимой процедуре !
|
|||
|---|---|---|---|
|
#18+
да остальные поля обновляются, что-то не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2009, 18:48 |
|
||
|
Проблема с записью даты в хранимой процедуре !
|
|||
|---|---|---|---|
|
#18+
Challengerда остальные поля обновляются, что-то не так?Да, код выгладит несколько странно. Оно работает так, как и должно. Вы написали обработчик исключений из одного оператора SET: Код: plaintext 1. 2. Такое присваивание, например, будет происходить если: - select into не вернёт ничего (not found) или вернёт более 1 записи (sqlexception) - один из delete не удалит ни одной записи Но если select into вернёт ровно 1 запись, а все delete успешно удалят хотя бы по 1 записи, то присваивание таймстэмпа не сработает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2009, 10:36 |
|
||
|
Проблема с записью даты в хранимой процедуре !
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein, спасибо большое за подсказку, Как здесь сделать корректно, чтобы присвоение производилось в любом случае? Насколько я понимаю нужно написать так? Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2009, 11:39 |
|
||
|
Проблема с записью даты в хранимой процедуре !
|
|||
|---|---|---|---|
|
#18+
Да, можно так. Ради интереса: у вас так специально задумано, что если select into вернёт более 1 зиписи, то вставится новая? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2009, 12:37 |
|
||
|
Проблема с записью даты в хранимой процедуре !
|
|||
|---|---|---|---|
|
#18+
Нет наверное еще одна ошибка. Почему так? Объясните пожалуйста. Запись должна вставляться только в том случае если нету записей вообще. @OLD_DOC_SYS_ID будет NULL если несколько записей? Почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2009, 11:35 |
|
||
|
Проблема с записью даты в хранимой процедуре !
|
|||
|---|---|---|---|
|
#18+
ChallengerЗапись должна вставляться только в том случае если нету записей вообще. @OLD_DOC_SYS_ID будет NULL если несколько записей? Почему?Потому, что если select into возвращает более 1 записи, то генерируется sqlexception (SQLSTATE 21000) и присваивание не происходит. У вас определен continue handler для всех sqlexception, т.е. выполнение продолжится со следующего оператора. А @OLD_DOC_SYS_ID как был NULL до select into, так NULL'ом и останется после него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2009, 11:59 |
|
||
|
Проблема с записью даты в хранимой процедуре !
|
|||
|---|---|---|---|
|
#18+
Получается в нашем случае нужно Код: plaintext 1. Код: plaintext 1. В этом случае, если будет ошибка, то продолжаться выполнение не будет, верно? В случае exception мне нужно прерывать выполнение процедуры, а не продолжать. И второй вопрос. Как корректно проверить существование записи в таблице внутри хранимой процедуры DB2, чтобы при наличии нескольких записей не генерировался Exception? Через Exists? Этот трюк который я использую в MsSQL например не генерирует exception. Поэтому я его и здесь не ожидал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2009, 12:50 |
|
||
|
Проблема с записью даты в хранимой процедуре !
|
|||
|---|---|---|---|
|
#18+
1. Если вы хотите, чтобы процедура делала атомарные (либо всё, либо ничего) изменения, и при ошибке прекращалось выполнение процедуры, то: ... P1: BEGIN ATOMIC ... DECLARE UNDO HANDLER FOR SQLEXCEPTION SET @RES = SQLCODE; ... END 2. ChallengerКак корректно проверить существование записи в таблице внутри хранимой процедуры DB2, чтобы при наличии нескольких записей не генерировался Exception? Через Exists?Проверить можно разными способами. Вопрос в том, что же вам надо делать, если по условию Код: plaintext 1. - Прерывать выполнение? - Продолжать? Тогда что именно делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2009, 13:29 |
|
||
|
Проблема с записью даты в хранимой процедуре !
|
|||
|---|---|---|---|
|
#18+
Я может быть не корректно сформулировал вопрос. Он не привязан к данной процедуре. Вопрос следующий. Как одним запросом проверить, есть ли запись в таблице, а если есть получить идентификатор одной из записей. Если запись одна, то соответственно ее идентификаторю В Ms SQL это делалось через переменную. А как это сделать в DB2? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2009, 15:18 |
|
||
|
Проблема с записью даты в хранимой процедуре !
|
|||
|---|---|---|---|
|
#18+
ChallengerКак одним запросом проверить, есть ли запись в таблице, а если есть получить идентификатор одной из записей. Если запись одна, то соответственно ее идентификаторю В Ms SQL это делалось через переменную. А как это сделать в DB2?Что должен возвратить запрос, если заданному условию соответствуют несколько записей? Например, для таблицы: tab(id, value) с данными (1, 1), (2, 1) вы выполняете запрос, который вернёт оба идентификатора: Код: plaintext 1. 2. 3. 4. 5. Чему будет равно значение этой переменной после такого присваивания? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2009, 15:51 |
|
||
|
Проблема с записью даты в хранимой процедуре !
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein, синтаксис будет другой немного select @id=id from table where value=1 В переменную @id будет выставлено значение "2" в Вашем примере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2009, 16:41 |
|
||
|
Проблема с записью даты в хранимой процедуре !
|
|||
|---|---|---|---|
|
#18+
Ради интереса: а почему не "1"? Есть какие-то правила возвращения значения в таких случаях в MS SQL? В db2 такой запрос должен возвращать не более 1 строки. Достигается это например так: 1. первую попавшуюся: Код: plaintext например: - с min id: Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2009, 17:04 |
|
||
|
|

start [/forum/topic.php?fid=43&fpage=73&tid=1602965]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
48ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
80ms |
get tp. blocked users: |
2ms |
| others: | 14ms |
| total: | 191ms |

| 0 / 0 |
