Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
10.01.2020, 16:04
|
|||
---|---|---|---|
|
|||
Использование anyelement в функции |
|||
#18+
Всем привет! Кто подскажет, как присвоить значение колонки для типа данных anyelement? Ситуация следующая:
Код: plsql 1. 2. 3. 4.
Код: plsql 1. 2. 3.
Код: plsql 1.
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Проблема в следующем - невозможно присвоить значение для столбца city переменной RET. Постгрес ругается, что такого нет - вроде правильно, ведь указан тип anyelement. Но это полиморфный тип и в рантайме он известен - это тип public.firdata. Как правильно записать значение в переменную RET ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.01.2020, 16:55
|
|||
---|---|---|---|
|
|||
Использование anyelement в функции |
|||
#18+
Не уверен, что anyelement можно возвращать. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.01.2020, 17:10
|
|||
---|---|---|---|
|
|||
Использование anyelement в функции |
|||
#18+
Guzya Не уверен, что anyelement можно возвращать. Можно. Следующий код работает и возвращает все как надо. Код: plsql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.01.2020, 22:22
|
|||
---|---|---|---|
|
|||
Использование anyelement в функции |
|||
#18+
А так Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.01.2020, 22:30
|
|||
---|---|---|---|
|
|||
Использование anyelement в функции |
|||
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Вот так не пробовали? Это из доки. В вашем случае в (*) result.city:='test'; Единственное не понял, зачем вам anyelement, если в коде явно указан record. Почему использовать этот тип? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
14.01.2020, 09:51
|
|||
---|---|---|---|
|
|||
Использование anyelement в функции |
|||
#18+
Troglodit Единственное не понял, зачем вам anyelement, если в коде явно указан record. Почему использовать этот тип? Anyelement нужен, чтобы иметь одну функцию аудита для разных таблиц. Используя тип anyelement, я могу прокидывать в функцию arc.maker строки любой таблицы. Это удобно и этим надо пользоваться, а не плодить однотипные функции. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
14.01.2020, 09:58
|
|||
---|---|---|---|
|
|||
Использование anyelement в функции |
|||
#18+
Нашел временное решение: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Необходимо протестировать на производительность в реале. Но пока никаких критических затыков не обнаружено. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
14.01.2020, 11:42
|
|||
---|---|---|---|
|
|||
Использование anyelement в функции |
|||
#18+
sdkmaster, Это точно работает ? Как Вы вызываете функцию ? Переменные типа record похожи на переменные строкового типа, но они не имеют предопределённой структуры. Они приобретают фактическую структуру от строки, которая им присваивается командами SELECT или FOR . Структура переменной типа record может меняться каждый раз при присвоении значения https://postgrespro.ru/docs/postgresql/9.5/plpgsql-declarations#plpgsql-declaration-records а в Вашем случае значение переменной RET - не определено, значит не определено и значение переменной rec, что приведёт к ошибке Код: sql 1. 2. 3. 4. 5.
в этом Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
в этом Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
и в этом Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
случаях ... |
|||
:
Нравится:
Не нравится:
|
|||
|
14.01.2020, 12:39
|
|||
---|---|---|---|
|
|||
Использование anyelement в функции |
|||
#18+
entrypoint Это точно работает ? Как Вы вызываете функцию ? Все отлично работает :) Вы упустили важный момент - функцию arc.maker дергает триггерная функция arc.chacha, которая передает записи NEW и OLD. А т.к. все anyelement в полиморфной функции должны быть одного(!) типа, то OUT переменная RET "наследует" тип IN переменных NEW и OLD. В первом сообщении описаны функции arc.chacha и arc.maker. Я передаю RET как "out RET anyelement", а в ваших примерах вы везде определяете ее как record, отсюда и ошибка. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
14.01.2020, 13:11
|
|||
---|---|---|---|
|
|||
Использование anyelement в функции |
|||
#18+
sdkmaster, ОК ))))) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
14.01.2020, 13:47
|
|||
---|---|---|---|
|
|||
Использование anyelement в функции |
|||
#18+
sdkmaster, sdkmaster entrypoint Это точно работает ? Как Вы вызываете функцию ? Все отлично работает :) Вы упустили важный момент - функцию arc.maker дергает триггерная функция arc.chacha, которая передает записи NEW и OLD. А т.к. все anyelement в полиморфной функции должны быть одного(!) типа, то OUT переменная RET "наследует" тип IN переменных NEW и OLD. В первом сообщении описаны функции arc.chacha и arc.maker. Я передаю RET как "out RET anyelement", а в ваших примерах вы везде определяете ее как record, отсюда и ошибка. всё же, если как у автора то, Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
, то Код: sql 1. 2. 3. 4. 5.
а если так, то Код: plsql 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.
, то нет значений Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
14.01.2020, 14:15
|
|||
---|---|---|---|
|
|||
Использование anyelement в функции |
|||
#18+
Всё Работает вот так Код: plsql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
14.01.2020, 19:08
|
|||
---|---|---|---|
|
|||
Использование anyelement в функции |
|||
#18+
sdkmaster Troglodit Единственное не понял, зачем вам anyelement, если в коде явно указан record. Почему использовать этот тип? Anyelement нужен, чтобы иметь одну функцию аудита для разных таблиц. Используя тип anyelement, я могу прокидывать в функцию arc.maker строки любой таблицы. Это удобно и этим надо пользоваться, а не плодить однотипные функции. Все ваши входящие параметры и есть record. Либо я может путаю, но в триггере NEW и OLD и есть record. Так что мне кажется вы перемудрили. Когда функция на PL/pgSQL срабатывает как триггер, в блоке верхнего уровня автоматически создаются несколько специальных переменных: NEW Тип данных RECORD. Переменная содержит новую строку базы данных для команд INSERT/UPDATE в триггерах уровня строки. В триггерах уровня оператора и для команды DELETE эта переменная имеет значение null. OLD Тип данных RECORD. Переменная содержит старую строку базы данных для команд UPDATE/DELETE в триггерах уровня строки. В триггерах уровня оператора и для команды INSERT эта переменная имеет значение null. Доку с про. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=53&mobile=1&tid=1994870]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
others: | 286ms |
total: | 423ms |
0 / 0 |