Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / проблема с триггером / 13 сообщений из 13, страница 1 из 1
24.08.2004, 15:55:54
    #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
24.08.2004, 16:47:34
    #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
24.08.2004, 16:52:15
    #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
24.08.2004, 17:01:51
    #32663508
vavcgcg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с триггером
Работает !
Делает то, что нужно !
Спасибо !
Я обожаю триггеры :)
...
Рейтинг: 0 / 0
24.08.2004, 17:03:31
    #32663511
vavcgcg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с триггером
Работает !
Делает то, что нужно !
Спасибо !
Я обожаю триггеры :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
21.09.2009, 16:52:35
    #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
21.09.2009, 17:13:33
    #36208316
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с триггером
Ну прально... Попробуйте в TG_OP засунуть INSERT и покажите мне где происходит RETURN в триггере?
...
Рейтинг: 0 / 0
21.09.2009, 17:19:05
    #36208331
ss25
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с триггером
ну там же в теле написано RETURN NEW; после закоментированного запроса

Со всеми разговариваю уважительно, но недолго. На вопросы типа ...Как дела? ...не отвечаю, это флуд.
© Lister the Tormentor
...
Рейтинг: 0 / 0
21.09.2009, 17:20:59
    #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
21.09.2009, 17:21:57
    #36208337
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с триггером
[FIX]IF (TG_OP != ''INSERT'') THEN[/FIX]
Это значит что если TG_OP НЕ INSERT то NEW, а если INSERT? То он ни в одну ветку не попадает и вываливается в конец триггера, где RETURN'а нет. О чем и радостно сообщает.
...
Рейтинг: 0 / 0
21.09.2009, 17:26:39
    #36208350
ss25
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с триггером
Моя невнимательность крайне извиняютсь ((

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

Со всеми разговариваю уважительно, но недолго. На вопросы типа ...Как дела? ...не отвечаю, это флуд.
© Lister the Tormentor
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
30.07.2014, 08:33:19
    #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
30.07.2014, 13:10:23
    #38709035
Lonepsycho
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с триггером
des1roer,

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


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