powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / plpgsql & temporary table
3 сообщений из 3, страница 1 из 1
plpgsql & temporary table
    #34540799
Фотография 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.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
CREATE OR REPLACE FUNCTION zak.zpost_mk_pnakl(id_zpost integer)
  RETURNS void AS
$BODY$
declare
	new_id int;
	id_post int;
begin
raise notice '#START#';
	--  создание приходной накладной из заявки поставщику:
	-- узнаём код поставщика - по шапке заявки:
	id_post=(select fk_post from zak.zak_post where id=id_zpost);
	-- выбираем позиции для импорта во временную таблицу:
		-- если без резерва - то смотрим ндс по заявке поставщику. 
		-- Иначе - по своему справочнику товаров. 
		-- Может и не оч правильно. может всё по поставщику надо??? будем посмотреть . . .
	create temp table zpoz on commit drop as 
	SELECT coalesce(fk_tov,- 1 ) as fk_tov, p.kvo,p.kvo2, cena, tam_cena, srok, p.id, 
			case when fk_tov is null then '>> ' || p.prep || ' | ' || p.proizv end as descr,
			coalesce(t.nds,p.nds, 0 ::bit) as nds
		FROM zak.vw_zak_post_poz p 
			join (zak.ztochek_to_zpost tp left join zak.vw_zak_tochek_poz t on tp.fk_ztochek_poz =t.id)
			on p.id=tp.fk_zpost_poz 
		where p.fk_zak_to_post=id_zpost;
raise notice 'step #1';
	-- 1. ф1 без ндс - если такие позиции есть в заявке!!!:
	if (select count(*) from zpoz where kvo> 0  and nds= 0 ::bit)> 0  then
		insert into skl.prih_doc(fk_ka, data, num_doc, nds, ok, f2,descr) 
			values(id_post,current_date,'new', 0 ::bit, 0 ::bit, 0 ::bit,'сформировано по заявке №' || id_zpost);
		new_id=lastval();
		INSERT INTO skl.prih_poz(
			fk_doc, fk_tov, kvo, cena, tam_cena, id_zpost_poz,descr)
		
		SELECT new_id, fk_tov, kvo, cena, coalesce(tam_cena,cena), id, descr
		FROM zpoz where kvo> 0  and nds= 0 ::bit; -- т.е. именно ф1!!!
	end if;
raise notice 'step #2';
	-- 2. ф1 С НДС - если такие позиции есть в заявке!!!:
	-- TODO: в прайсах то цены С НДС!!! - т.е. тут наверное снимать надо ндс - хранить то надо цены БЕЗ НДС!!!
	if (select count(*) from zpoz where kvo> 0  and nds= 1 ::bit)> 0  then
		insert into skl.prih_doc(fk_ka, data, num_doc, nds, ok, f2,descr) 
			values(id_post,current_date,'new', 1 ::bit, 0 ::bit, 0 ::bit,'сформировано по заявке №' || id_zpost);
		new_id=lastval();
		INSERT INTO skl.prih_poz(
			fk_doc, fk_tov, kvo, cena, tam_cena, id_zpost_poz,descr)
		
		SELECT new_id, fk_tov, kvo, cena,coalesce(tam_cena,cena), id, descr
		FROM zpoz where kvo> 0  and nds= 1 ::bit;
	end if;
raise notice 'step #3';
	-- 3. ф2 С/БЕЗ НДС - всё в одну кучу!!!
	if (select count(*) from zpoz where kvo2> 0 )> 0  then
		insert into skl.prih_doc(fk_ka, data, num_doc, nds, ok, f2,descr) 
			values(id_post,current_date,'new', 0 ::bit, 0 ::bit, 1 ::bit,'сформировано по заявке №' || id_zpost);
		new_id=lastval();
		INSERT INTO skl.prih_poz(
			fk_doc, fk_tov, kvo, cena, tam_cena, id_zpost_poz,descr)
		
		SELECT new_id, fk_tov, kvo2, cena, cena, id, descr
		FROM zpoz where kvo2> 0 ; 
	end if;
raise notice '#END#';
end;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

и работает как-то странно эта функция: 1 раз выполняется - а потом выдаёт постоянно ошибку - мол отношение с каким-то там ойдом оно не находит. причём не находит оно его сразу же после raise notice 'step #1' - в следующем за ним селекте. как я понял оно временную таблицу мою не находит - не понимаю почему. ну и ладно бы ещё гдето ближе к концу функции - ато так прямо сразу - не успели её мы создать - уже блин гдето она потерялась :(.
как я понял эта таблица после коммита должна удаляться - а он в свою очередь по идее в конце функции происходит. что-то видимо я тут пропустил в теории. помогите пожалуйста разобраться.
да - функция эта один раз выполняется нормально - а потом ругаться начинает постоянно. и после перезапуска сервера опять всё поновой - один раз работает - и опять наша песня хороша - начинай с начала :(
...
Рейтинг: 0 / 0
plpgsql & temporary table
    #34540876
ChameLe0n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Неоднократно обсуждалось... ищи
...
Рейтинг: 0 / 0
plpgsql & temporary table
    #34542520
Фотография aov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо, разобрался. появились правда по execute вопросы :) - но это уже другая тема :)
PS: щас токо воспоминания смутные появляться начали, что про трабл с ойдами где-то я уже читал - токо тогда это мне не нужно было - и не отложилось :). а как понадобилось - не нашол.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / plpgsql & temporary table
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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