|
Перенос процедуры из Оракла, что не так?
|
|||
---|---|---|---|
#18+
Добрый день. Есть такая процедурка в Оракле: Код: 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.
Хочу ее перенсти в постгрес: Код: 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.
вылазит сообщение об ошибке: Код: sql 1. 2. 3.
Что я делаю не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2017, 14:32 |
|
Перенос процедуры из Оракла, что не так?
|
|||
---|---|---|---|
#18+
Sheriffua, Текст функции в общем виде таков: Код: sql 1. 2. 3. 4. 5. 6. 7.
У вас функция не “закончена”, `IF` не закрыт, `LOOP` не закрыт (в обратном порядке). ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2017, 14:41 |
|
Перенос процедуры из Оракла, что не так?
|
|||
---|---|---|---|
#18+
Sheriffua, Нужен END, чтобы завершить определение функции. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2017, 14:45 |
|
Перенос процедуры из Оракла, что не так?
|
|||
---|---|---|---|
#18+
Спасибо за подсказки. Переписал так: Код: 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.
но при этом у меня почему-то в таблицу err_docs_param2 инсертится 48 записей дублей одного и того же DOC_ID, почему так? По идее должна быть одна запись. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2017, 15:34 |
|
Перенос процедуры из Оракла, что не так?
|
|||
---|---|---|---|
#18+
Sheriffua, Мне думается, что вы начали заниматься теми же извращёнными манипуляциями с датами, которые характерны для ORACLE-а: Код: plaintext 1.
В Postgres'е иначе всё работает, и в типе `date` нету временной составляющей. Вам следует использовать тип `timestamptz` и для манипуляций пользоваться интервалами. Что там происходит — не знаю. Добавьте отладку через конструкцию `RAISE NOTICE`. Скорее всего в этом выражении Код: sql 1.
получается не `1`, а 48 — очень похоже. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2017, 20:54 |
|
Перенос процедуры из Оракла, что не так?
|
|||
---|---|---|---|
#18+
vyegorov, Спасибо за разъяснения. Хотелось бы еще уточнить следующее: у меня колонка dt_import в таблице DOCUMENTS имеет тип - timestamp, как правильно нужно указать диапазон в постгресе для такого типа? Код: sql 1.
если указал как в приведенном своем примере, то данная айдишка не выбирается, диапазон задаю в виде: 01.06.2017 и 02.06.2017 но при этом сам атрибут dt_import имеет вид 01.06.2017 16:20:35 когда же убираю время и оставляю только дату для этой айдишки, то она выбирается как я уже озвучивал - 48 раз!, но вы это уже пояснили и я понял, осталось разобраться как привести правильно атрибут со временем. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2017, 21:42 |
|
Перенос процедуры из Оракла, что не так?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2017, 22:18 |
|
Перенос процедуры из Оракла, что не так?
|
|||
---|---|---|---|
#18+
Sheriffua, Хм, не совсем понял что у вас не работает. Код: plaintext 1. 2.
Вам нужно поступить так: все переменные в теле функции привести к тем же типам, что и соответствующие им колонки. Postgres очень требователен к типам; при работе с датами я предпочитаю использовать YYYY-MM-DD HH24:MI:SS нотацию (ISO8601), т.к. ПЖ “понимает” её легко в виде строковых констант, с другими форматами можно нарваться; если типу `timestamp`/`timestamptz` вы присваиваете дату, то время берётся по полуночи 00:00; в данном случае я бы использовал что-то такое: `d.dt_import >= dt_part AND d.dt_import < dt_part + INTERVAL '1day'` — обращаю внимание на открытую верхнюю границу диапазона Рекомендации общие: Postgres запросы приводит к нижнему регистру (в отличии от ORACLE и от стандарта), так что шифт можно не зажимать если вы получаете ошибку, то очень полезно приводить её целиком — сообщения более информативны, чем у ORACLE; в Postgres-е есть Set-Returning-Functions , они полезны для генерации последовательностей; у вас очень ”процедурный” код. рекомендую посмотреть на конструкции вида `FOR var IN query LOOP ... END LOOP `, очень удобно. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2017, 23:12 |
|
Перенос процедуры из Оракла, что не так?
|
|||
---|---|---|---|
#18+
vyegorov, Спасибо за подробное описание. В продолжение вопроса, привожу формат таблицы документов. "doc_id""case_numb""crt_crt_id""st_st_id""dt_case""dt_registration""row_version""is_row_delete""pkg_pkg_id""prev_case_numb""prev_dt_case""rc_doc_vr_type""rc_doc_cs_type""csc_csc_id""rc_doc_ins_type""old_case_numb""old_dt_case""prev_crt_crt_id""prev_dt_registration""is_ph_present""is_gov_present""is_session_public""full_st_st_id""imp_st_st_id""dt_created""is_blocked""is_archiv""file_name""dt_import""rc_doc_src_type""is_err_letter_exists""usr_usr_id""reg_numb""crt_name""crt_prev_uid""crt_prev_name""doc_prev_uid""dt_notice""dt_law""judge_fio""binary_image_count""crt_crt_tag_id""tag_numb""dt_tag""crt_uid""doc_uid""is_signature_present""dt_notice_impersonal""is_return_on_dep""is_return_on_dest""dt_disabled""is_jur_present""rc_doc_process_type""usr_usr_dest_id""usr_usr_dep_id""dt_operation_dest""dt_operation_dep""is_temp_block_public""is_problem""delay_publication_term""dnzs_id""date_doc_send_from_court""dt_doc_sign_send_from_court""dt_doc_text_send_from_court""dt_zvit""hearingclosed"66 825 571"326/630/17" 465 622.05.201730.05.2017 20null"null"null 5 1 1 078 1"null"nullnullnull101 8 1501.06.2017 0:00:0000"0822_1323284.html"01.06.2017 16:08:18 40 1"66825571""Приморський районний суд Запорізької області""null""null""null"01.06.2017 0:00:0005.06.2017"Стріжакова Т. В." 0 465"null"null"819""1323284"106.06.2017 0:00:00nullnullnull0 1 1nullnullnullnull0null30 698 84331.05.2017 0:00:0031.05.2017 0:00:0031.05.201731.05.2017null Теперь привожу решение функции, которую перенес из Оракла: Код: 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.
при таком раскладе функция не находит данный документ, но если я из даты уберу время, то поиск проходит, но при этом кол-во записей в таблицу ошибок дублируются 48 раз (с этим вопросом понятно, т.к. задается период 2 суток, 01-02/06/2017 и он по формуле разбивается на цикл в 48 проходов). Как привести данные в функции к формату даты - dd.mm.yyyy h24:mm:ss ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2017, 09:14 |
|
Перенос процедуры из Оракла, что не так?
|
|||
---|---|---|---|
#18+
vyegorov, для чего нужно именно так - расчет должен производиться не по дням, а по часам , поэтому и надо построить цикл, чтобы опрос по таблице документов проходил 24 раза за сутки. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2017, 09:24 |
|
Перенос процедуры из Оракла, что не так?
|
|||
---|---|---|---|
#18+
Sheriffua, а приведите DDL для таблицы, пожалуйста, я с картинками не очень; а вот так вот делать не очень хорошо `set timezone = 'Europe/Kiev';`, потом искать все такие “нычки” по коду очень грустно. полагайтесь на настройки сессии; вы в коде ничего не поменяли в местах работы с датами. зачем там везде пляски с 24 часами? Если вы хотите помощи в логике, то поясните что означают входные параметры функции, особенно `i`. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2017, 09:58 |
|
Перенос процедуры из Оракла, что не так?
|
|||
---|---|---|---|
#18+
vyegorov, Передалал так и процес пошел: Код: 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.
возможно как-то можно упростить данную функцию с использованием фич ПЖ...но пока как говорится только начал его изучение. а DDL таблицы таков: Код: 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. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100.
и спасибо за помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2017, 10:50 |
|
|
start [/forum/topic.php?fid=53&fpage=66&tid=1996221]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
others: | 289ms |
total: | 438ms |
0 / 0 |