Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
возможности функций в Postgres - поясните
|
|||
|---|---|---|---|
|
#18+
Долгое время писал под MSSQL, соответственно сложно переключиться между подходами в организации бизнес-логики. Задача. Есть сущность "Событие", есть сущность "Абонент". Каждое событие принадлежит какому-то абоненту, связь многие-к-одному (FK). структура: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. В идеале evid и abid ещё и "счётчиками" должны быть (ну либо из последовательности браться). По бизнес-логике, нужна хранимка с параметрами @evname и @abname, которая делает следующее: 1. Проверяет таблицу abonents на предмет нахождения там записи с abname=@abname. 2. Если таковая запись нашлась - берёт её abid, если не нашлась - добавляет и берёт abid добавленной. 3. Добавляет запись в events с полученным abid 4. Возвращает в качестве результата evid добавленной записи. Собственно, чтобы было понятней, привожу вариант хп для mssql: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2008, 13:12 |
|
||
|
возможности функций в Postgres - поясните
|
|||
|---|---|---|---|
|
#18+
Собственно, вопросы: 1. Вообще, насколько такой подход организации бизнес-логики применим в Postgres? Может "принято" как-то по-другому поступать, например через триггеры или что-то ещё? 2. Как переменной внутри функции приравнять результат запроса, причём желательно обойтись без дополнительного if exists (MSSQL, к примеру, не меняет значения переменной, если нужных записей не нашлось) 3. Как можно организовать функцию и каким образом будет выглядеть её вызов через ADOCommand так, чтобы не получать result-set, а просто получить то, что возвращается через return (ADOCommand.Execute)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2008, 13:18 |
|
||
|
возможности функций в Postgres - поясните
|
|||
|---|---|---|---|
|
#18+
EgaСобственно, вопросы: 1. Вообще, насколько такой подход организации бизнес-логики применим в Postgres? Может "принято" как-то по-другому поступать, например через триггеры или что-то ещё? 2. Как переменной внутри функции приравнять результат запроса, причём желательно обойтись без дополнительного if exists (MSSQL, к примеру, не меняет значения переменной, если нужных записей не нашлось) 3. Как можно организовать функцию и каким образом будет выглядеть её вызов через ADOCommand так, чтобы не получать result-set, а просто получить то, что возвращается через return (ADOCommand.Execute)? 1. Поступать принято как позволяет совесть 2. Один из вариантов SELECT ... INTO _var1, _var2; 3. Я всегда делал DataSet.Open для подобного запроса SELECT s_eveproc('abname', 'evname'). Всё работало и не жужжало :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2008, 13:24 |
|
||
|
возможности функций в Postgres - поясните
|
|||
|---|---|---|---|
|
#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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2008, 13:40 |
|
||
|
возможности функций в Postgres - поясните
|
|||
|---|---|---|---|
|
#18+
Ega, по мне так нормально едиственное, я бы сам написал вместо if _abid is null then -> if not found then ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2008, 13:46 |
|
||
|
возможности функций в Postgres - поясните
|
|||
|---|---|---|---|
|
#18+
Dan Blackедиственное, я бы сам написал вместо if _abid is null then -> if not found then О! Вот за это - офигенное спасибо. Именно это и хотел узнать. Только я почему-то эту штуку в документации найти не могу. Раздел не подскажешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2008, 14:54 |
|
||
|
возможности функций в Postgres - поясните
|
|||
|---|---|---|---|
|
#18+
EgaРаздел не подскажешь?38.5.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2008, 15:27 |
|
||
|
возможности функций в Postgres - поясните
|
|||
|---|---|---|---|
|
#18+
Dan BlackEgaРаздел не подскажешь?38.5.5 Спасибо! Полезная штука. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2008, 16:26 |
|
||
|
возможности функций в Postgres - поясните
|
|||
|---|---|---|---|
|
#18+
Ega Код: plaintext 1. 2. 3. 4. 5. 6. Если между этими двумя коммандами будет вставка в другой транзакции и она закомитится, то Вы получите UNIQUE VIOLATION. Следствие - этот INSERT нужно обрамить ексепшен-уловителем и повторным запросом к базе на предмет ID. пример из мурзилки : Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2008, 22:00 |
|
||
|
возможности функций в Postgres - поясните
|
|||
|---|---|---|---|
|
#18+
Andrey DaeronEga Код: plaintext 1. 2. 3. 4. 5. 6. Если между этими двумя коммандами будет вставка в другой транзакции и она закомитится, то Вы получите UNIQUE VIOLATION. Следствие - этот INSERT нужно обрамить ексепшен-уловителем и повторным запросом к базе на предмет ID. откуда ? на abname нет ограничения уникальности, а nextval всегда разный будет - это гарантируется. он совершенно успешно вставит два одинаковых имени в двух параллельных транзакциях :) в этом куске может быть другая проблема - если после Код: plaintext Код: plaintext что бы защититься от этого предлагаю делать: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2008, 22:43 |
|
||
|
возможности функций в Postgres - поясните
|
|||
|---|---|---|---|
|
#18+
Ёш откуда ? на abname нет ограничения уникальности, а nextval всегда разный будет - это гарантируется. он совершенно успешно вставит два одинаковых имени в двух параллельных транзакциях :) [/quot] Точно! ) Но я че-то думаю, что она там появится ))) Ёш в этом куске может быть другая проблема - если после Код: plaintext Код: plaintext Код: plaintext +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2008, 12:23 |
|
||
|
возможности функций в Postgres - поясните
|
|||
|---|---|---|---|
|
#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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2008, 20:03 |
|
||
|
возможности функций в Postgres - поясните
|
|||
|---|---|---|---|
|
#18+
Funny_Falcon...Если продолжать тему идеальной хранимой процедуры, то я бы как минимум не стал делать теоретически бесконечный цикл ;) + чисто теоретически, в большинстве случаев в таблице abonents будут существовать записи с именем abname, поэтому insert будет в большистве случаев вызввать эксепшн, накладные расходы на который относительно велеки. Поэтому разумнее будет в начале проверять существование записи в таблице простым селектом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 07:28 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=35680449&tid=2003846]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
59ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 384ms |

| 0 / 0 |
