powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / plpgsql, looping через квери резулт :) - помогите плз разобраться с глюком
5 сообщений из 5, страница 1 из 1
plpgsql, looping через квери резулт :) - помогите плз разобраться с глюком
    #34659314
Фотография aov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
такая вот функция:
Код: 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.
create or replace function zak.itogi_po_tochkam(p_id_post int) returns text as
$$
declare 
	t text=''; r record; cmd text;
begin
/*
	cmd='select count(*) as cnt,ka.kaname,sum(p.cena*t.kvo) as sum1,sum(p.cena*t.kvo2) as sum2,sum(p.cena*(coalesce(t.kvo,0)+coalesce(t.kvo2,0))) as sum_all
		from zak.ztochek_to_zpost t
		join zak.zak_tochek_poz tp on t.fk_ztochek_poz=tp.id
		join zak.zak_tochek zt on tp.fk_zak_tochki=zt.id
		join spr.ka ka on zt.fk_tochki=ka.id
		join zak.zak_post_poz p on t.fk_zpost_poz=p.id
		where p.fk_zak_to_post is null and fk_post=' || p_id_post || ' group by kaname;';
*/
	for r in  
		select count(*) as cnt,ka.kaname,sum(p.cena*t.kvo) as sum1,sum(p.cena*t.kvo2) as sum2,sum(p.cena*(coalesce(t.kvo, 0 )+coalesce(t.kvo2, 0 ))) as sum_all
			from zak.ztochek_to_zpost t
			join zak.zak_tochek_poz tp on t.fk_ztochek_poz=tp.id
			join zak.zak_tochek zt on tp.fk_zak_tochki=zt.id
			join spr.ka ka on zt.fk_tochki=ka.id
			join zak.zak_post_poz p on t.fk_zpost_poz=p.id
			where p.fk_zak_to_post is null and fk_post=p_id_post 
			order by kaname
			group by kaname
	loop
		t=t || chr( 10 ) 
			|| chr( 13 ) 
			|| r.kaname 
			|| '  поз.' 
			|| r.cnt 
			|| '  ' 
			|| to_char(r.sum1,'999 990.00')
			|| ' + ' 
			|| to_char(r.sum2,'999 990.00') 
			|| ' = ' 
			|| to_char(r.sum_all,'999 990.00');
	end loop;
	return t;
end
$$ language plpgsql;

почемуто упорно оно ругается на использование параметра в запросе, который в цикле используется. когда for r in execute cmd - тогда нормально всё. нельзя тут параметры использовать? токо через execute?

и ещё вопрос - можете громко смеяться и что угодно говорить - но он именно главный. именно тут чёто я забуксовал. может очепятка гдето у меня - но я все глаза проглядел - в упор ничего не вижу подозрительного. короче трабл в том, что когда вот этот запрос который в цикле используется выдаёт больше 1-й строки - то функция null возвращает - вместо многострочного текста. я не понимаю что там за полтергейст. бред какой-то :(

а вот проверочная функция:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create or replace function test.test() returns text as
$$
declare 
	t text='';i int;
begin
	for i in  1 .. 20  loop
		t=t || chr( 10 ) || chr( 13 ) || 'bla bla bla';
	end loop;
	return t;
end
$$ language plpgsql;

это вроде как практически одно и тоже. но тест работает как часы.
помогите плз разобраться где тут собака порыта. вообще не понимаю что происходит. даже если бы запрос не вернул ни одной строки - тогда бы тоже не могло оно быть null - ведь ему же сразу присваивается значение - ''. ну я на всякий случай там поставил не '' а 'x' - однохренственно :(
...
Рейтинг: 0 / 0
plpgsql, looping через квери резулт :) - помогите плз разобраться с глюком
    #34659901
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aovпочемуто упорно оно ругается на использование параметра в запросе, который в цикле используется. когда for r in execute cmd - тогда нормально всё. нельзя тут параметры использовать? токо через execute?Проверьте, не пересекаются ли названия переменных plpgsql и полей в таблицах, участвующих в запросе.
aovи ещё вопрос - можете громко смеяться и что угодно говорить - но он именно главный. именно тут чёто я забуксовал. может очепятка гдето у меня - но я все глаза проглядел - в упор ничего не вижу подозрительного. короче трабл в том, что когда вот этот запрос который в цикле используется выдаёт больше 1-й строки - то функция null возвращает - вместо многострочного текста. я не понимаю что там за полтергейст. бред какой-то :( Поставьте raize info на все переменные, из которых склеивается результирующая строка, одна из них будет NULL.
...
Рейтинг: 0 / 0
plpgsql, looping через квери резулт :) - помогите плз разобраться с глюком
    #34660152
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надо начать с того, что в приведенном коде нет вообще знака присваивания ( := ), зато присутствует знак проверки на равенство

Verba volent, scripta manent
...
Рейтинг: 0 / 0
plpgsql, looping через квери резулт :) - помогите плз разобраться с глюком
    #34660727
Фотография aov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо большое - действительно видимо из-за null там результат такой получается. надо coalesce везде поставить. который раз на эти грабли настумаю - но в основном на математических операциях - а на конкатенации как-то ещё не попадался. вообще не знаю кто придумал что результатом будет нул если одна из переменных нул. и зачем это и кому надо - тоже не оч понимаю.
и не оч понимаю в чём разница между "=" и ":=". вроде у меня и так и так бывает - разницы не замечал пока. она есть?
...
Рейтинг: 0 / 0
plpgsql, looping через квери резулт :) - помогите плз разобраться с глюком
    #34660730
Фотография aov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо большое - действительно видимо из-за null там результат такой получается. надо coalesce везде поставить. который раз на эти грабли настумаю - но в основном на математических операциях - а на конкатенации как-то ещё не попадался. вообще не знаю кто придумал что результатом будет нул если одна из переменных нул. и зачем это и кому надо - тоже не оч понимаю.
и не оч понимаю в чём разница между "=" и ":=". вроде у меня и так и так бывает - разницы не замечал пока. она есть?
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / plpgsql, looping через квери резулт :) - помогите плз разобраться с глюком
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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