|
Почему не удается вызвать функцию SETOF?
|
|||
---|---|---|---|
#18+
Запрашиваю из таблицы три текстовые колонки: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Получаю ошибку несоответствия типов: авторSQL Error [42804]: ERROR: structure of query does not match function result type Detail: Returned type character varying(100) does not match expected type text in column 1. Where: SQL statement "SELECT first_name, email, mobile_phone FROM public.USER WHERE id = l_user_key::numeric" PL/pgSQL function setof_user_profile(json) line 5 at RETURN QUERY На входе простой json: Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 04:04 |
|
Почему не удается вызвать функцию SETOF?
|
|||
---|---|---|---|
#18+
romaro, написано - RETURNS SETOF text (т.е. 1 колонка типа text) а вы 3 колонки возвращаете в запросе да ещё и 1е поле в ней не text типа. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 09:16 |
|
Почему не удается вызвать функцию SETOF?
|
|||
---|---|---|---|
#18+
romaro, WHERE id = (p_json ->> 'l_user_key')::integer; jsonb ->> text → text Извлекает поле JSON-объекта по заданному ключу, в виде значения text. '{"a":1,"b":2}'::json ->> 'b' → 2 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 10:43 |
|
Почему не удается вызвать функцию SETOF?
|
|||
---|---|---|---|
#18+
Если я правильно понял из скудной документации и ответа на этот вопрос , SETOF следует использовать в том случае, когда в базе уже есть объявленное представление или другая структура данных. Объявить новый тип записи в самой процедуре не получится. Поэтому в моем случае нужно использовать returns table: авторCREATE OR REPLACE FUNCTION public.setof_user_profile(p_json json) RETURNS TABLE (col1 varchar, col2 varchar, col3 varchar) LANGUAGE plpgsql AS $function$ BEGIN RETURN QUERY SELECT first_name, email, mobile_phone FROM public.USER WHERE id = (p_json ->> 'userKey')::integer; RETURN; END; $function$ ; Однако она сваливает все данные в одну колонку. Есть ли способ разнести их на несколько? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2021, 02:27 |
|
Почему не удается вызвать функцию SETOF?
|
|||
---|---|---|---|
#18+
romaro Если я правильно понял из скудной документации и ответа на этот вопрос , SETOF следует использовать в том случае, когда в базе уже есть объявленное представление или другая структура данных. Объявить новый тип записи в самой процедуре не получится. Поэтому в моем случае нужно использовать returns table: авторCREATE OR REPLACE FUNCTION public.setof_user_profile(p_json json) RETURNS TABLE (col1 varchar, col2 varchar, col3 varchar) LANGUAGE plpgsql AS $function$ BEGIN RETURN QUERY SELECT first_name, email, mobile_phone FROM public.USER WHERE id = (p_json ->> 'userKey')::integer; RETURN; END; $function$ ; Однако она сваливает все данные в одну колонку. Есть ли способ разнести их на несколько? А покажите как вы эту процедуру вызываете? 90% что вы вызываете её неверно. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2021, 10:06 |
|
Почему не удается вызвать функцию SETOF?
|
|||
---|---|---|---|
#18+
Maxim Boguk, Вызов: Код: plsql 1.
Еще раз код процедуры: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Вызываю через DBeaver, приходит строка вида: автор(Иван,mail@gmail.com,797777777777) И структура таблицы: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2021, 10:54 |
|
Почему не удается вызвать функцию SETOF?
|
|||
---|---|---|---|
#18+
romaro, Ну вот как я и написал неверно вызываете... авторSELECT public.setof_user_profile('{"userKey":"21"}'); надо Код: sql 1.
-- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2021, 11:10 |
|
Почему не удается вызвать функцию SETOF?
|
|||
---|---|---|---|
#18+
Maxim Boguk, Спасибо! Действительно не разобрался. А верно я понял, что setof только для заранее поименованных представлений? Я нигде не нашел примеров, как в теле функции объявить кастомный набор данных. То есть через setof можно вернуть либо колонку, либо сослаться на уже существующую таблицу/представление? В итоге returns table как бы более универсален? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2021, 12:15 |
|
Почему не удается вызвать функцию SETOF?
|
|||
---|---|---|---|
#18+
romaro Maxim Boguk, Спасибо! Действительно не разобрался. А верно я понял, что setof только для заранее поименованных представлений? Я нигде не нашел примеров, как в теле функции объявить кастомный набор данных. То есть через setof можно вернуть либо колонку, либо сослаться на уже существующую таблицу/представление? В итоге returns table как бы более универсален? Как бы более универсален до тех пор пока вам не надо написать 10 функций возврашающих ВСЕ поля некоей таблицы причём заранее известно что список полей будет меняться.... и тогда setof tablename - очевидно удобнее. А когда надо вернуть заданный список полей - тогда returns table. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2021, 16:19 |
|
Почему не удается вызвать функцию SETOF?
|
|||
---|---|---|---|
#18+
Добавлю, что returns table это стандарт SQL. А setof это постгресовый вариант, который появился раньше. А функционал и смысл одинаковый. Если хотите через setof вернуть несколько столбцов, то это можно сделать через out параметры и setof record: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2021, 20:17 |
|
|
start [/forum/topic.php?fid=53&msg=40108279&tid=1993801]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 255ms |
total: | 376ms |
0 / 0 |