powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / OUT'ы, SETOF of record'ы и все-все-все
21 сообщений из 21, страница 1 из 1
OUT'ы, SETOF of record'ы и все-все-все
    #38833251
VanillaNInja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята, помогите разобраться, как запустить сие чудо:
Код: 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.
CREATE OR REPLACE FUNCTION "public"."test"(int4, json)
  RETURNS SETOF "pg_catalog"."record" AS $BODY$ 
DECLARE
rb boolean;
vld text;
msg text;
clmn_name text;
v text;
codes text[];
msg_param text;
BEGIN
 codes := ARRAY 
    [
      'code1'
    ];
  for v in select unnest(codes)

  loop
        IF ((SELECT NULLIF(json_extract_path_text($2, 'first_param'), '') IS NOT NULL)  AND 
             (SELECT NULLIF(json_extract_path_text($2, 'sec_param'), '') IS NOT NULL)) THEN
                    IF (json_extract_path_text($2, 'first_param')='2' and json_extract_path_text($2, 'sec_param')<>'9') THEN
                                rb := true; vld :='code1'; 
                                msg := 'hi there!';
                clmn_name := '1';
                    RETURN NEXT rb, vld, msg, clmn_name;    
                END IF; 
ELSE    

            end if;

      end loop;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE COST 100
 ROWS 1000
;



когда пытаюсь так:
Код: plsql
1.
2.
3.
[SQL]select * from test(0::integer, '{"first_param":"2", "sec_param":"5"}'::json)

[Err] ERROR:  a column definition list is required for functions returning "record"




Когда так:
Код: plsql
1.
2.
3.
4.
5.
[SQL]
select * from test(0::integer, '{"first_param":"2", "sec_param":"5"}'::json) t1(rb boolean, vld text, msg text, clmn_name text)

[Err] ERROR:  query "SELECT rb, vld, msg, clmn_name" returned 4 columns
CONTEXT:  PL/pgSQL function test(integer,json) line 24 at RETURN NEXT



Даже пытался первую строчку заменить на
CREATE OR REPLACE FUNCTION "public"."test"(IN int4, IN json, OUT rb bool, OUT vld text, OUT msg text, IN clmn_name text)

но в этом случае - не понимаю, как ее вызвать, ибо
Код: plsql
1.
2.
3.
4.
[SQL]select * from test(0::integer, '{"first_param":"2", "sec_param":"5"}'::json)

[Err] ERROR:  function test(integer, json) does not exist
LINE 1: select * from test(0::integer, '{"first_par...


помогите разобраться, а? :-)
...
Рейтинг: 0 / 0
OUT'ы, SETOF of record'ы и все-все-все
    #38833261
/\/\/\/\/\/\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VanillaNInja,

Вам английским языком говорят: Вы пытаетесь вернуть 4 колонки, хотя должны вернуть только одну величину типа "запись".

То есть Вы пытаетесь вернуть не то, что обязались согласно объявлению функции.
Да и в объявлении функции фигня какая-то написана.

Должна быть и еще одна ошибка, так как между ELSE и END IF нет ни одного оператора.

Итого:
1. Разберитесь, что Вы хотите получить на выходе функции. Прямо сейчас это не понятно.
2. Что заказали, то и верните в теле.
...
Рейтинг: 0 / 0
OUT'ы, SETOF of record'ы и все-все-все
    #38833264
VanillaNInja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
/\/\/\/\/\/\,

чтрочка с else - там лишняя. Забыл удалить следы тестироваия :-/

Хочу получить рекорд с 4мя полями. Ну то есть не обязательно рекорд. Но четыре поля. Я об этом и пытаюсь сообщить кусочком: t1(rb boolean, vld text, msg text, clmn_name text) Я же ей указываю те 4 поля, которые надо вернуть. Но она мне отвечает "Ошибка, возвращаю 4 поля"
...
Рейтинг: 0 / 0
OUT'ы, SETOF of record'ы и все-все-все
    #38833269
VanillaNInja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
точнее, хочется получить как раз некоторое число рекордов с этими 4мя полями.
...
Рейтинг: 0 / 0
OUT'ы, SETOF of record'ы и все-все-все
    #38833279
/\/\/\/\/\/\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VanillaNInja,

Хочется - так делайте!

Прочитайте RTFM . Там все написано.

Кстати, у Вас на удивление мерзкий стиль написания кода.
...
Рейтинг: 0 / 0
OUT'ы, SETOF of record'ы и все-все-все
    #38833280
VanillaNInja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А со стилем что не так?
...
Рейтинг: 0 / 0
OUT'ы, SETOF of record'ы и все-все-все
    #38833286
Фотография SmeL_md
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VanillaNInjaА со стилем что не так?если (NULL сделай пустой текст и если после этого не NULL ) то сделай подобную проверку
...
Рейтинг: 0 / 0
OUT'ы, SETOF of record'ы и все-все-все
    #38833290
/\/\/\/\/\/\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VanillaNInja,

Много ненужных слов, которые уводят в сторону от главного смысла.
Так пишут тупые роботы из встроенных помогалок.

Расскажите зачем:
-- Берете наименование схемы и наименование функции в кавычки.
-- Зачем указываете наименование схемы. (Особенно мерзко смотрится "pg_catalog"."record")
-- Зачем указываете параметры в конце функции, которые можно и не указывать?
-- Пишете какие-то странные типы
-- Не пользуетесь алиасами, а обращаетесь к параметрам по номеру.

Ну и форматирование отсутствует.

Укажите пример из официального RTFM для поддерживаемой версии PG, где пишется именно так.
...
Рейтинг: 0 / 0
OUT'ы, SETOF of record'ы и все-все-все
    #38833292
VanillaNInja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
/\/\/\/\/\/\,

На самом деле, как образцом кода было то, как пишут у меня в компании. Никогда не задумывался что это плохо :-/
Спасибо за советы. Будем исправляться :-)
...
Рейтинг: 0 / 0
OUT'ы, SETOF of record'ы и все-все-все
    #38833293
VanillaNInja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SmeL_md,

если вы про строчку
Код: plsql
1.
     IF ((SELECT NULLIF(json_extract_path_text($2, 'first_param'), '') IS NOT NULL) 



То я не представляю как это элегантно сделать, избежав 2х проверок. Результат json_extract_path_text может быть как ' ' так null
...
Рейтинг: 0 / 0
OUT'ы, SETOF of record'ы и все-все-все
    #38833399
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот ELSE там совершенно не мешает, это не ара-кал

проблема у вас вот какая
Воспроизводим ваш код, вернее его синтаксическую струтуру:
Код: 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.
101.
102.
103.
104.
105.
106.
CREATE OR REPLACE FUNCTION "public"."test"(int4, json)
  RETURNS SETOF "pg_catalog"."record" AS $BODY$ 
DECLARE
rb boolean;
vld text;
msg text;
clmn_name text;
v text;
codes text[];
msg_param text;
BEGIN
	codes := ARRAY 
		[
		'code1'
		];
	for v in select unnest(codes)

	loop
		IF TRUE --((SELECT NULLIF(json_extract_path_text($2, 'first_param'), '') IS NOT NULL)  AND 
			--(SELECT NULLIF(json_extract_path_text($2, 'sec_param'), '') IS NOT NULL))
			THEN
			IF true -- (json_extract_path_text($2, 'first_param')='2' and json_extract_path_text($2, 'sec_param')<>'9') 
			THEN
				rb := true; vld :='code1'; 
				msg := 'hi there!';
				clmn_name := '1';
				RETURN NEXT rb, vld, msg, clmn_name;	
			END IF; 
		ELSE	

		end if;

	end loop;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE COST 100
 ROWS 1000
;
-- вызываю специально неверно
select * from "public"."test"(1,null) as t(f text);
/*
ERROR:  query "SELECT rb, vld, msg, clmn_name" returned 4 columns
CONTEXT:  PL/pgSQL function test(integer,json) line 26 at RETURN NEXT
*/
-- правим вашу конструкцию RETURN:
CREATE OR REPLACE FUNCTION "public"."test"(int4, json)
  RETURNS SETOF "pg_catalog"."record" AS $BODY$ 
DECLARE
rb boolean;
vld text;
msg text;
clmn_name text;
v text;
codes text[];
msg_param text;
BEGIN
	codes := ARRAY 
		[
		'code1'
		];
	for v in select unnest(codes)

	loop
		IF TRUE --((SELECT NULLIF(json_extract_path_text($2, 'first_param'), '') IS NOT NULL)  AND 
			--(SELECT NULLIF(json_extract_path_text($2, 'sec_param'), '') IS NOT NULL))
			THEN
			IF true -- (json_extract_path_text($2, 'first_param')='2' and json_extract_path_text($2, 'sec_param')<>'9') 
			THEN
				rb := true; vld :='code1'; 
				msg := 'hi there!';
				clmn_name := '1';
				RETURN NEXT (rb, vld, msg, clmn_name);
			END IF; 
		ELSE	

		end if;

	end loop;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE COST 100
 ROWS 1000
;
-- несколько тестовых вызовов (вариации ошибок вызова):
select * from "public"."test"(1,null) as t(f text);
/*
ERROR:  returned record type does not match expected record type
DETAIL:  Returned type boolean does not match expected type text in column 1.
CONTEXT:  PL/pgSQL function test(integer,json) line 26 at RETURN NEX
*/

select * from "public"."test"(1,null) as t(f boolean);
/*
ERROR:  returned record type does not match expected record type
DETAIL:  Number of returned columns (4) does not match expected column count (1).
CONTEXT:  PL/pgSQL function test(integer,json) line 26 at RETURN NEXT
*/


select * from "public"."test"(1,null) as t
(rb boolean,
vld text,
msg text,
clmn_name text
);
--t,'code1','hi there!','1'


...
Рейтинг: 0 / 0
OUT'ы, SETOF of record'ы и все-все-все
    #38833410
/\/\/\/\/\/\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
лопата,

По-моему автор не выучил все буквы и пока не может складывать слова. А Вы говорите о том как правильно рифмовать.

Мне кажется, что более правильно будет подтолкнуть автора (в том числе и пинками) к тому, что нужно правильно указать входные и выходные параметры функции. То есть либо пометить выходные параметры OUT и RETURNS SETOF record, либо написать RETURNS TABLE (p1 INTEGER, ... ) . Пока автор не прочтет документацию (именно это и написано в документации), указанные Вами действия будут очень сильным колдунством.

Пока автор бездумно полагается на какой-то конструктор функций, который все делает за него. Наверное, и думает тоже.


По поводу ELSE действительно так. В энциклопедии юных сурков разъяснено, что это не обязательно.
Просто тогда ELSE нужно удалить.
...
Рейтинг: 0 / 0
OUT'ы, SETOF of record'ы и все-все-все
    #38833420
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/\/\/\/\/\/\,

насчет OUT [|RETURNS TABLE] в данном случае вы правы
везде, где тип возврата фиксирован на момент создания ф-ии -- это уместно.
есть ситуации когда тип возврата зависит от параметров, и вызов может вычислить тип возврата в момент вызова самостийно (dblink crosstab и т.п.) -- вот тогда и уместно траха иметь дело с описанием типа в момент вызова.
есть совсем третьи ситуации - и там всё внутри пж нехорошо, остается фетчить курсоры


offtop:
но я сам сплошь и рядом пользую
Код: sql
1.
2.
3.
4.
5.
IF <boolean> THEN
    -- do nothing
ELSE 
   ...do somthing
END IF;


именно для троичной логики, и мне это читаемее, чем
Код: sql
1.
2.
3.
4.
5.
6.
7.
IF NOT COALESCE(<boolean>,FALSE) THEN
   ...do somthing
END IF;
---OR 
IF COALESCE( NOT <boolean>,TRUE) THEN
   ...do somthing
END IF;


и не только в plpgsql
поэтому я и не разделяю православной ортодоксии
...
Рейтинг: 0 / 0
OUT'ы, SETOF of record'ы и все-все-все
    #38834187
VanillaNInja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
/\/\/\/\/\/\,

Я не понимаю, откуда столько ненависти к вопрошающим? Я стараюсь уважать чужое время и задаю вопросы, когда сам не могу найти ответа/разобраться в том числе и в документации. От вас же одно говно да и фраза "читайте доку". При этом пытаетесь дать какие-то ложные выводы о конструкторах кода и прочем.
Короче, вы очень неприятная тварь :-/

Лопата, спасибо большое. Очень Хорошо все объяснил. Все работает. Я крайне признателен :-)
...
Рейтинг: 0 / 0
OUT'ы, SETOF of record'ы и все-все-все
    #38834225
/\/\/\/\/\/\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VanillaNInja,

Тогда уж поймаю на слове:
И сколько раз Вы эту доку прочитали?
Почему задаете вопрос по тем вещам, которые явно указаны в примерах документации?
...
Рейтинг: 0 / 0
OUT'ы, SETOF of record'ы и все-все-все
    #38834238
VanillaNInja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
От корки до корки? Ни разу. Мне тяжело читать ее как беллетристику. Доку использую как справочник.

Задал вопрос по той вещи которую не смог найти в документации. Ваша ссылка в том числе ничего не прояснила. Зато лопата смог очень явно указать на то что четыре значения не являются рекордом, если их предварительно не взять в скобки.
...
Рейтинг: 0 / 0
OUT'ы, SETOF of record'ы и все-все-все
    #38834263
/\/\/\/\/\/\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VanillaNInja,

Вы получили совершенно тоный ответ на неверно заданный вопрос. Оно Вас еще неоднократно догонит (хотя, уже догнало).

Конкретно у меня ненависть вызывает неспособность прочитать 1 (одну) страницу текста, где ответ содержится в виде описания, а потом в виде примера. Похоже, что неспособность эта хроническая .


Что Вам нужно было сделать:
По ссылке из сообщения 16994356 прочитать теорию и ознакомисться с примерами:
авторCREATE FUNCTION sum_n_product(x int, y int, OUT sum int, OUT prod int) AS $$
BEGIN
sum := x + y;
prod := x * y;
END;
$$ LANGUAGE plpgsql;

и
авторCREATE FUNCTION extended_sales(p_itemno int)
RETURNS TABLE(quantity int, total numeric) AS $$
BEGIN
RETURN QUERY SELECT quantity, quantity * price FROM sales
WHERE itemno = p_itemno;
END;
$$ LANGUAGE plpgsql;
This is exactly equivalent to declaring one or more OUT parameters and specifying RETURNS SETOF sometype.

Ну, и нытиков нигде не любят.
...
Рейтинг: 0 / 0
OUT'ы, SETOF of record'ы и все-все-все
    #38834313
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VanillaNInja/\/\/\/\/\/\,

Я не понимаю, откуда столько ненависти к вопрошающим? Я стараюсь уважать чужое время и задаю вопросы, когда сам не могу найти ответа/разобраться в том числе и в документации.
нам отсюда не видно
VanillaNInja От вас же одно говно да и фраза "читайте доку". При этом пытаетесь дать какие-то ложные выводы о конструкторах кода и прочем.
Короче, вы очень неприятная тварь :-/это наша родина, сынок
VanillaNInjaЛопата, спасибо большое. Очень Хорошо все объяснил. Все работает. Я крайне признателен :-)
незачто. зубцы тащем-то прав. У меня просто было время вам разжевать, и было всё равно понятно, что пинать вас в сторону обучения работе с докой (не читать все подряд, а пользуясь find + google найти ответы на свои вопросы) -- нет смысла. привыкли доить людей походу, и тут же обгаживать.

с такой-то ленью -- вам всё-ж-таки социализироваться не мешает получше, чтобы не только влезть, но и понукать при этом сподручнее было.
...
Рейтинг: 0 / 0
OUT'ы, SETOF of record'ы и все-все-все
    #38834319
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/\/\/\/\/\/\,



анек про воздушный шар, кодера (|математика) и манагера вспоминается.

так и ходим -- всюду уиноватые
...
Рейтинг: 0 / 0
OUT'ы, SETOF of record'ы и все-все-все
    #38834341
/\/\/\/\/\/\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
лопатаУ меня просто было время вам разжевать...

Не соглашусь.
По-моему Вы просто дали обезьяне гранату и объяснили как выдернуть чеку. Ни гранаты, ни обезьяны не жалко.

Анекдот - да, именно этот.
...
Рейтинг: 0 / 0
OUT'ы, SETOF of record'ы и все-все-все
    #38834372
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/\/\/\/\/\/\,

ненене, вывсёврёти,
я ничего не давал
оно ходило вокруг слона и что-то нащупало
вытарчивающее
а я просто объяснил, как за это "что-то" дёргать синтаксически правильно
чтобы слон не брыкался
в другой раз вы сами можете рассказать что-то полезное из вредных советов
главное не увлекайтесь

а с какой стороны правильно подходить к слону -- это сильное кунг-фу, много слов и тычков в rtfm надо произвести, и так и не научить. к тому же слон наиболее удачен именно со стороны доки, как это не странно. заставить бы падаванов доку ара-кала вслух читать. вот где содом, война и немцы
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / OUT'ы, SETOF of record'ы и все-все-все
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]