powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / проблема с триггером
13 сообщений из 13, страница 1 из 1
проблема с триггером
    #32663343
vavcgcg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица :

CREATE TABLE public.an_obz (
id int4 DEFAULT nextval('"an_obz_id_seq"'::text) NOT NULL,
date char(14),
url text,
title text,
text text,
type int4,
source char(512),
status int4 DEFAULT 0,
indexed int2 DEFAULT 0,
CONSTRAINT an_obz_pkey PRIMARY KEY (id)
) WITH OIDS;

В ней есть записи.

Создаю функцию :

CREATE or replace FUNCTION public.vav_update_an_obz() RETURNS trigger AS 'begin
update an_obz set indexed = 0 where id = old.id;
end;' LANGUAGE 'plpgsql' STABLE;

Создаю триггер :

CREATE TRIGGER up_an_obz AFTER UPDATE ON public.an_obz FOR EACH ROW EXECUTE PROCEDURE vav_update_an_obz();

Т.е. хочу, чтобы при изменении записи в таблице an_obz , значение
поля indexed этой записи становилось равным 0...

Делаю запрос :

update an_obz set text = 'qwewewe' where id = 5;

Получаю ошибку :

2004-08-24 15:47:40 [32003] ERROR: control reached end of trigger procedure without RETURN
CONTEXT: PL/pgSQL function "vav_update_an_obz"

Где собака зарыта ???
...
Рейтинг: 0 / 0
проблема с триггером
    #32663457
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собака в необходимости
RETURN (что-нито) в теле ф-ии. (напр: ... RETURN OLD; END;)

например, для вашего случая:
Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE or replace FUNCTION public.vav_update_an_obz() RETURNS trigger AS '
DECLARE
begin
%af_src_comm_0
NEW.indexed :=0;
Return NEW;
end;' LANGUAGE 'plpgsql' STABLE;
автор
DROP TRIGGER up_an_obz ON public.an_obz;
CREATE TRIGGER up_an_obz BEFORE UPDATE ON public.an_obz FOR EACH ROW EXECUTE PROCEDURE vav_update_an_obz();
(А иначе на бесконечный цикл смахивает )
...
Рейтинг: 0 / 0
проблема с триггером
    #32663475
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторCREATE or replace FUNCTION public.vav_update_an_obz() RETURNS trigger AS '
DECLARE
begin
/* update an_obz set indexed = 0 where id = old.id; */
NEW.indexed :=0;
Return NEW;
end;' LANGUAGE 'plpgsql' STABLE;

былин, форматировщик кода глотает /* ... */ внутри строки
...
Рейтинг: 0 / 0
проблема с триггером
    #32663508
vavcgcg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Работает !
Делает то, что нужно !
Спасибо !
Я обожаю триггеры :)
...
Рейтинг: 0 / 0
проблема с триггером
    #32663511
vavcgcg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Работает !
Делает то, что нужно !
Спасибо !
Я обожаю триггеры :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
проблема с триггером
    #36208263
Фотография ss25
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такая же проблема на PG 8.4.0 на FreeBSD
если без тригера то вставка проходит иначе ошибка

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 2009 - 09 - 21   15 : 49 : 36  UTC - [pgsql:abis] - LOG:  duration:  0 . 174  ms  parse pdo_pgsql_stmt_0a62893c: SELECT library.inv_add($ 1 , $ 2 , $ 3 , $ 4 )
 2009 - 09 - 21   15 : 49 : 36  UTC - [pgsql:abis] - LOG:  duration:  0 . 037  ms  bind pdo_pgsql_stmt_0a62893c: SELECT library.inv_add($ 1 , $ 2 , $ 3 , $ 4 )
 2009 - 09 - 21   15 : 49 : 36  UTC - [pgsql:abis] - DETAIL:  parameters: $ 1  = '31', $ 2  = '4578', $ 3  = '123', $ 4  = '25'
 2009 - 09 - 21   15 : 49 : 36  UTC - [pgsql:abis] - ERROR:  control reached end of trigger procedure without RETURN
 2009 - 09 - 21   15 : 49 : 36  UTC - [pgsql:abis] - CONTEXT:  PL/pgSQL function "trg_a_ins_upd_del_inv_add"
        SQL statement "INSERT INTO library.books_inv (book_id, price, inv) VALUES ( $1 ,  $2 ,  $3 )"
        PL/pgSQL function "inv_add" line  17  at SQL statement
 2009 - 09 - 21   15 : 49 : 36  UTC - [pgsql:abis] - STATEMENT:  SELECT library.inv_add($ 1 , $ 2 , $ 3 , $ 4 )

Функция вставки
Код: 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.
CREATE OR REPLACE FUNCTION "library"."inv_add" (integer, integer, integer, numeric) RETURNS boolean AS 'DECLARE

_book_id       INT4;
_price         NUMERIC(20,2);
_cnt           INT4;
_inv           INT4;
_i             INT4;
BEGIN

_book_id    := $1;
_inv        := $2;
_cnt        := $3;
_price      := $4;
_i          := 0;

WHILE (_i < _cnt) LOOP
     INSERT INTO library.books_inv (book_id, price, inv) VALUES (_book_id, _price, _inv);
     _inv := _inv + 1;
     _i := _i + 1;
END LOOP;

RETURN TRUE;
END;' LANGUAGE "plpgsql" COST  100 
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER

Тригер
Код: 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.
CREATE OR REPLACE FUNCTION "library"."trg_a_ins_upd_del_inv_add" () RETURNS trigger AS 'BEGIN
IF (TG_OP != ''INSERT'') THEN
--    UPDATE library.books SET 
--                  cnt_inv = cnt_inv + 1, 
--                  cnt_nal = cnt_nal + 1,
--                  sum_inv = sum_inv + NEW.price,
--                  sum_nal = sum_nal + NEW.price,
--                  last_add = NOW()::date 
--          WHERE id = NEW.book_id;
    RETURN NEW;
ELSIF (TG_OP = ''UPDATE'') THEN
--    UPDATE library.books SET 
--                  sum_inv = sum_inv + NEW.price - OLD.price,
--                  sum_nal = sum_nal + NEW.price - OLD.price,
--                  last_add = NEW.data::date 
--          WHERE id = NEW.book_id;
    RETURN NEW;
ELSIF (TG_OP = ''DELETE'') THEN
--    UPDATE library.books SET 
--                  cnt_inv = cnt_inv - 1, 
--                  cnt_nal = cnt_nal - 1,
--                  sum_inv = sum_inv - OLD.price,
--                  sum_nal = sum_nal - OLD.price,
--                  last_add = NOW()::date 
--          WHERE id = OLD.book_id;
    RETURN OLD;
END IF;
END;' LANGUAGE "plpgsql" COST  100 
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER

...
Рейтинг: 0 / 0
проблема с триггером
    #36208316
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну прально... Попробуйте в TG_OP засунуть INSERT и покажите мне где происходит RETURN в триггере?
...
Рейтинг: 0 / 0
проблема с триггером
    #36208331
Фотография ss25
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну там же в теле написано RETURN NEW; после закоментированного запроса

Со всеми разговариваю уважительно, но недолго. На вопросы типа ...Как дела? ...не отвечаю, это флуд.
© Lister the Tormentor
...
Рейтинг: 0 / 0
проблема с триггером
    #36208335
Фотография ss25
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
 2009 - 09 - 21   16 : 18 : 52  UTC - [pgsql:abis] - STATEMENT:  SELECT library.inv_add( 31 , 4578 , 123 , 25 );
 2009 - 09 - 21   16 : 19 : 21  UTC - [pgsql:abis] - ERROR:  control reached end of trigger procedure without RETURN
 2009 - 09 - 21   16 : 19 : 21  UTC - [pgsql:abis] - CONTEXT:  PL/pgSQL function "trg_a_ins_upd_del_inv_add"
 2009 - 09 - 21   16 : 19 : 21  UTC - [pgsql:abis] - STATEMENT:  INSERT INTO library.books_inv (book_id, price, inv) VALUES ( 31 , 4578 , 23 );
Со всеми разговариваю уважительно, но недолго. На вопросы типа ...Как дела? ...не отвечаю, это флуд.
© Lister the Tormentor
...
Рейтинг: 0 / 0
проблема с триггером
    #36208337
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[FIX]IF (TG_OP != ''INSERT'') THEN[/FIX]
Это значит что если TG_OP НЕ INSERT то NEW, а если INSERT? То он ни в одну ветку не попадает и вываливается в конец триггера, где RETURN'а нет. О чем и радостно сообщает.
...
Рейтинг: 0 / 0
проблема с триггером
    #36208350
Фотография ss25
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Моя невнимательность крайне извиняютсь ((

ошибку узрел и прозрел ))

Со всеми разговариваю уважительно, но недолго. На вопросы типа ...Как дела? ...не отвечаю, это флуд.
© Lister the Tormentor
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
проблема с триггером
    #38708671
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подскажите как отлаживать триггер?
налетаю на
Код: sql
1.
2.
3.
07/30/2014 10:28:13|Debug|Npgsql.NpgsqlException:
control reached end of trigger procedure without RETURN
Severity: ERROR


понимаю что ретурн нужно сделать а вот где и как?
функция (осторожно много кода)
Код: 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.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
CREATE OR REPLACE FUNCTION "SC_Tag".functionparse (
)
RETURNS trigger AS
$body$
DECLARE
t1 timestamp;
t2 timestamp;
dt interval;
tc timestamp;
delta integer;
curval real;
cursum real;
presum real;
result text;
BEGIN
	SELECT * FROM(
	SELECT 	"F_Date", 
			"ID_TagData"
	INTO t1 
	FROM 
	  "SC_Tag"."T_TagData" 
	WHERE "F_TagName_ID" = 3   
	ORDER BY "ID_TagData" DESC LIMIT 2)
	AS foo ORDER BY "ID_TagData" ASC LIMIT 1;
	  
	SELECT  "F_Date", 
			"ID_TagData"
	INTO t2 
	FROM 
	  "SC_Tag"."T_TagData" 
	WHERE "F_TagName_ID" = 3   
	ORDER BY "ID_TagData" DESC LIMIT 1;

	
	IF(t1 >  date(t2)+ time '08:00' AND t1 < date(t2) + time '20:00' 
	AND
    t2 >  date(t2)+ time '08:00' AND t2 < date(t2) + time '20:00')
	THEN
		SELECT 		"F_Date", 
					"ID_TagData"
			INTO tc 
			FROM 	"SC_Tag"."T_TagData" 
			WHERE "F_TagName_ID" = 2  
			ORDER BY "ID_TagData" DESC LIMIT 1;
			IF (tc >  date(t2)+ time '08:00' AND tc < date(t2) + time '20:00' )
				THEN					  	
					  dt = t2 - t1;
					  result = dt;
					  --RETURN ('2 смена '||result);
					  IF (dt <= '00:00:35')
						THEN 
														
							SELECT 	"F_ConvertedValue", 
									"ID_TagData"
							INTO curval 
							FROM 	"SC_Tag"."T_TagData" 
							WHERE "F_TagName_ID" = 3   
							ORDER BY "ID_TagData" DESC LIMIT 1;
						  
							SELECT 	"F_ConvertedValue", 
									"ID_TagData"
							INTO presum 	
							FROM 	"SC_Tag"."T_TagData" 
							WHERE "F_TagName_ID" = 2   AND  "F_ConvertedValue" IS NOT NULL 
							ORDER BY "ID_TagData" DESC LIMIT 1;
						
								IF (tc <t2)
								  THEN
									SELECT EXTRACT (EPOCH FROM dt) 
									INTO delta;
									cursum = curval/delta;
									cursum = presum + cursum;
									INSERT INTO 
										"SC_Tag"."T_TagData"
									  (
										"F_TagName_ID",
										"F_ConvertedValue",
										"F_Date" 
									  )
									VALUES (
										2,
										cursum,
										t2
									  );  
									result = cursum;
									RETURN NEW;
								END IF;
							--return ('hz');
                            RETURN OLD;
						END IF;
			ELSE 
			--t1 записываем за 0	
				INSERT INTO 
										"SC_Tag"."T_TagData"
									  (
										"F_TagName_ID",
										"F_ConvertedValue",
										"F_Date" 
									  )
									VALUES (
										2,
										0,
										t1
									  ); 
                RETURN NEW;
			END IF;
	  
	ELSEIF (t1 > date(t2) - interval '24 hours'+ time '20:00' AND t1 < date(t2) + time '8:00'
	AND
	t2 > date(t2) - interval '24 hours'+ time '20:00' AND t2 < date(t2) + time '8:00')
	THEN
		SELECT 		"F_Date", 
					"ID_TagData"
			INTO tc 
			FROM 	"SC_Tag"."T_TagData" 
			WHERE "F_TagName_ID" = 2  
			ORDER BY "ID_TagData" DESC LIMIT 1;
			IF (tc > date(t2) - interval '24 hours'+ time '20:00' AND tc < date(t2) + time '8:00' )
				THEN					  	
					  dt = t2 - t1;
					  result = dt;
					  --RETURN ('1 смена '||result);
					  IF (dt <= '00:00:35')
						THEN 
														
							SELECT 	"F_ConvertedValue", 
									"ID_TagData"
							INTO curval 
							FROM 	"SC_Tag"."T_TagData" 
							WHERE "F_TagName_ID" = 3   
							ORDER BY "ID_TagData" DESC LIMIT 1;
						  
							SELECT 	"F_ConvertedValue", 
									"ID_TagData"
							INTO presum 
							FROM 	"SC_Tag"."T_TagData" 
							WHERE "F_TagName_ID" = 2   AND  "F_ConvertedValue" IS NOT NULL
							ORDER BY "ID_TagData" DESC LIMIT 1;
						
								IF (tc <t2)
								  THEN
									SELECT EXTRACT (EPOCH FROM dt) 
									INTO delta;
									cursum = curval/delta;
									cursum = presum + cursum;
									INSERT INTO 
										"SC_Tag"."T_TagData"
									  (
										"F_TagName_ID",
										"F_ConvertedValue",
										"F_Date" 
									  )
									VALUES (
										2,
										cursum,
										t2
									  );  
									result = cursum;
									RETURN NEW;
								END IF;
							--return ('hz2');
                            RETURN OLD;
						END IF;
			ELSE 
			--t1 записываем за 0	
				INSERT INTO 
										"SC_Tag"."T_TagData"
									  (
										"F_TagName_ID",
										"F_ConvertedValue",
										"F_Date" 
									  )
									VALUES (
										2,
										0,
										t1
									  ); 
                RETURN NEW;
			END IF;
            
	ELSEIF (t1 > date(t2) - interval '24 hours'+ time '20:00' AND t1 < date(t2) + time '8:00'
    AND
    t2 >  date(t2)+ time '08:00' AND t2 < date(t2) + time '20:00')
	THEN	 
      --t2 записываем за 0	
      INSERT INTO 
										"SC_Tag"."T_TagData"
									  (
										"F_TagName_ID",
										"F_ConvertedValue",
										"F_Date" 
									  )
									VALUES (
										2,
										0,
										t2
									  ); 
	  result = t2;
	  RETURN NEW;
	  
	ELSEIF (t1 >  date(t1)+ time '08:00' AND t1 < date(t1) + time '20:00'
    AND
    t2 > date(t1) + time '20:00' AND t2 < date(t1) +interval '24 hours' + time '8:00')
	THEN
	  --t2 записываем за 0	
      INSERT INTO 
										"SC_Tag"."T_TagData"
									  (
										"F_TagName_ID",
										"F_ConvertedValue",
										"F_Date" 
									  )
									VALUES (
										2,
										0,
										t2
									  ); 
	  result = t1;
	  RETURN NEW;
	  
	END IF;
	
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;


триггер
Код: sql
1.
2.
3.
4.
5.
CREATE TRIGGER calc
  AFTER INSERT 
  ON "SC_Tag"."T_TagData" FOR EACH ROW 
  WHEN (pg_trigger_depth() = 0)
EXECUTE PROCEDURE "SC_Tag".functionparse();
...
Рейтинг: 0 / 0
проблема с триггером
    #38709035
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,

у вас не обрабатывается ELSE. то есть RETURN NEW происходит только в IF и ELSIF. может их вобще убрать из обрабатывания IF..ELSIF..ELSE..END и делать один единственный RETURN NEW; в конце? не углублялся очень в ваш код правда...
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / проблема с триггером
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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