Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#18+
Хотелось бы прояснить следующую ситуацию. Имеем функцию: CREATE OR REPLACE FUNCTION func(i1 integer, ...) RETURNS ... AS $$ DECLARE Rcd RECORD; BEGIN IF i1 IS NOT NULL THEN SELECT * FROM table1 WHERE table1.id = i1 LIMIT 1 INTO Rcd; -- > После запроса Rcd не равен NULL END IF; IF Rcd IS NOT NULL -- > А здесь Rcd после выхода из предыдущего блока IF_END_ IF вдруг оказывается равным NULL !!! THEN -- куча операторов; END IF; ... END; $$ language plpgsql; Создается впечатление, что объявленная переменная типа RECORD действительна только в рамках блока IF_END_IF, где она создается, а далее очищается (насколько я понимаю, очищается и lookup cash с результатами выборки по запросу). И что мне делать с кучей операторов после IF, вставлять их после каждой выборки в блоке IF (а этих блоков у меня шесть штук)??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2008, 19:42 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#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. 52. 53. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2008, 21:25 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2008, 21:54 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#18+
"INTO Rcd" дожен идти сразу после "SELECT *". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2008, 23:07 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#18+
На первый ответ. Спасибо, попробовал вашу конструкцию. Выглядит так CREATE OR REPLACE FUNCTION get_cotactinfo(idfirm integer, idperson integer, isfull boolean) RETURNS varchar AS $$ DECLARE Rcd RECORD; ret varchar(512); BEGIN IF idfirm IS NOT NULL THEN IF idperson IS NOT NULL THEN SELECT DISTINCT * INTO Rcd FROM contacts WHERE contacts.eid_firm = idfirm AND contacts.eid_person = idperson LIMIT 1; IF Rcd IS NULL THEN -- проверка ret := 'RCD is NULL'; SELECT DISTINCT * INTO Rcd FROM contacts WHERE contacts.eid_person = idperson LIMIT 1; ELSE -- проверка ret := 'RCD is not NULL'; END IF; ELSE SELECT DISTINCT * INTO Rcd FROM contacts WHERE contacts.eid_firm = idfirm LIMIT 1; END IF; ELSE IF idperson IS NOT NULL THEN SELECT DISTINCT * INTO Rcd FROM contacts WHERE contacts.eid_person = idperson LIMIT 1; END IF; END IF; IF Rcd IS NOT NULL THEN -- проверка ret := ret || '-RCD is not NULL'; ELSE -- проверка ret := ret || '-Rcd is NULL'; END IF; return ret; END; $$ language plpgsql; Итог: RCD is not NULL-Rcd is NULL , т.е. конструкция SELECT DISTINCT * INTO Rcd работает также, как и в первом случае, вернее не работает, по крайней мере у меня. ( PostgreSQL 8.3.3 тестовая система на Windows XP) ___________________________________________________________________ Второй ответ не понял. Это не мой случай (конструкцию моей функции см. выше) ___________________________________________________________________ Третий ответ - Что по лбу, что ниже, результат тот же: RCD is not NULL-Rcd is NULL . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2008, 23:51 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#18+
Путем уже не мозговых усилий заставил функцию работать, но в особо извращенной форме: IF Rcd IS NULL THEN --> пусто !!! ELSE --> операторы !!! END IF; PostgreSQL 8.3 на Windows XP SP3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 05:34 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#18+
простите, но вы говорите какуюто ерунду... я думаю что проблема у вас в нагромождении ифоф, в которых вы сами разобрться не можете. Используйте вместо "ret := 'RCD is not NULL';" raise notice с разными сообщениями и увидите как именно работает ваша логика ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 11:08 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#18+
Уважаемый st_serg! Если Вы посмотрите листинг с телом функции выше, то именно такой подход для проверки я и применил. В итоге (на практике) все оказалось не так, как я предполагал, изначально задавая вопрос, а гораздо проще, но от этого мне нисколько не понятней. Обратите внимание на последний блок IF в моем втором примере. Хотите верьте, хотите не верьте, но... IF Rcd IS NOT NULL THEN --> нет перехода!!! ELSE END IF; не работает, а IF Rcd IS NULL THEN ELSE --> есть переход!!! END IF; работает! (Кроме этого блока ничего в функции не менял!) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 12:57 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#18+
SergeyVNЕсли Вы посмотрите листинг с телом функции выше, то именно такой подход для проверки я и применил.покажите пальцем где там raise notice ? :) ps: Честно говоря, Ваш код невозможно прочитать. Используйте пожалуйста нормальное выравнивание вложенных блоков и тег форума src что бы Ваш пример раскрашивался цветом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 13:12 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. По-моему всё чудно работает. P.S.: Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 13:14 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#18+
SergeyVNНа первый ответ. Спасибо, попробовал вашу конструкцию. Выглядит так Код: 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. ( PostgreSQL 8.3.3 тестовая система на Windows XP) ___________________________________________________________________ Второй ответ не понял. Это не мой случай (конструкцию моей функции см. выше) ___________________________________________________________________ Третий ответ - Что по лбу, что ниже, результат тот же: RCD is not NULL-Rcd is NULL . таки странно. какая версия ПГ ? (в одном из старых пг был баг на проверку IS DISTICT FROM для записей/переменных внутри plpgsql ф-й. а в чистом скл проверьте вот это: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 13:56 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#18+
для переменной типа RECORD условия IS NULL и IS NOT NULL не являются отрицаниями друг друга. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. можеь быть дело в этом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 14:11 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#18+
LeXa NalBatдля переменной типа RECORD условия IS NULL и IS NOT NULL не являются отрицаниями друг друга. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. у меня Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 14:19 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#18+
это поменялось то ли в 8.2, то ли в 8.3 (незнаю как точно перевести "exhibited by PostgreSQL versions prior to 8.2" :) ) http://www.postgresql.org/docs/current/interactive/functions-comparison.html автор expression IS NULL expression IS NOT NULL [skip] Note : If the expression is row-valued, then IS NULL is true when the row expression itself is null or when all the row's fields are null, while IS NOT NULL is true when the row expression itself is non-null and all the row's fields are non-null. This definition conforms to the SQL standard, and is a change from the inconsistent behavior exhibited by PostgreSQL versions prior to 8.2. для типа row/record: is null = true, если само выражение null или все поля null is not null = true, если само выражение не null и все поля не null такое поведение соответствует стандарту SQL -- „Истина — это вовсе не то, что можно убедительно доказать, это то, что делает всё проще и понятнее“ — Антуан де Сент-Экзюпери ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 14:45 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#18+
assaверсия ПЖ?PostgreSQL 8.3.0 on x86_64-unknown-linux-gnu,.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 14:52 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat assaверсия ПЖ?PostgreSQL 8.3.0 on x86_64-unknown-linux-gnu,..Ёш уже разъяснил, что начиная с 8.2... т.ч. автору надо попросту проверять FOUND после селектов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 14:56 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#18+
assa Ёш уже разъяснил, что начиная с 8.2... ЗЫ : для 8.1 NULL только если запись отсуствует . (NULL,NULL)::RECORD - была NOT NULL т.е. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 15:02 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#18+
автору надо проверять Rcd в обоих местах одинаковым способом, или оба раза Rcd IS NULL, или оба раза Rcd IS NOT NULL, или иначе, в зависимости от постановки задачи SergeyVN Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 15:08 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#18+
А что если вместо "Rcd is not null" изпользовать "not Rcd is null"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 15:11 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#18+
LeXa NalBatавтору надо проверять Rcd в обоих местах одинаковым способом, или оба раза Rcd IS NULL, или оба раза Rcd IS NOT NULL, или иначе, в зависимости от постановки задачи автора интересует банальный FOUND, чему до 8.2 соответсnвовало (...)::RECORD IS NULL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 15:11 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#18+
SergeyVN Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 15:19 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#18+
DAISERА что если вместо "Rcd is not null" изпользовать "not Rcd is null"?это разные условия Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: plaintext 1. 2. 3. 4. assaавтора интересует банальный FOUNDможет быть так, это автору виднее, в зависимости от условий его задачи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 15:24 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat DAISERА что если вместо "Rcd is not null" изпользовать "not Rcd is null"?это разные условия Я это имел в виду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 17:01 |
|
||
|
Действительность переменной типа RECORD в функции
|
|||
|---|---|---|---|
|
#18+
Огромное спасибо всем, особенно Ёшу. Это объясняет казалось бы нелогичное поведение оператора 'Rcd IS NOT NULL' в блоке IF. "If the expression is row-valued, then IS NULL is true when the row expression itself is null or when all the row's fields are null, while IS NOT NULL is true when the row expression itself is non-null and all the row's fields are non-null. This definition conforms to the SQL standard, and is a change from the inconsistent behavior exhibited by PostgreSQL versions prior to 8.2." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 17:27 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=35532949&tid=2004068]: |
0ms |
get settings: |
13ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
70ms |
get topic data: |
12ms |
get forum data: |
4ms |
get page messages: |
83ms |
get tp. blocked users: |
2ms |
| others: | 248ms |
| total: | 460ms |

| 0 / 0 |
