powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / select into
21 сообщений из 21, страница 1 из 1
select into
    #33600189
4_Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тригер:
завпрос:
select dialpeer_name,active into dialpeername,active_p from dialpeer where id = NEW.id_dp;

active_p integer;
dialpeername varchar(200);

переменные dialpeername,active_p нулевые, я их для теста в том же тригере
insert into tb_test_val (text_f) values (dialpeername);
insert into tb_test_val (text_f) values (active_p);

хотя если сделать выборку руками то всё ОК.

и сам тригер не работает изза этого правильно.
Плиз помогите, select into уже не первый раз так глючит, точно такая же функция с дургим именем и для других таблиц работает.
...
Рейтинг: 0 / 0
select into
    #33600474
4_Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
может непонятно выразился, переменным dialpeername и active_p не присваиваються необходимые значения
...
Рейтинг: 0 / 0
select into
    #33600550
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4_Alexможет непонятно выразилсяа что, приводить код гордость не позволяет?
здаецца он и попонятней за вас выразится, и гадать не придется
...
Рейтинг: 0 / 0
select into
    #33600670
4_Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DECLARE ---NOT USED
--generate NEW.id_dp DP cfg_curs_pr
cfg_curs_pr CURSOR FOR select par.parametr_name,cfg.parametr, cfg.id_ss from tb_dialpeer_db_cfg cfg,tb_parametr_cfg par
where cfg.id_parametr = par.id and cfg.id_dp=NEW.id_dp and cfg.id_ss = NEW.id_ss order by par.id;
dp_cfg text;
par_parametr_name varchar;
par_parametr_value varchar;
group_name varchar;
cfg_id integer; active_p integer;
dialpeername varchar(200);act varchar;
cnt integer; cnt_par integer;
def_ss_id integer;ss_id integer;id integer;
BEGIN
delete from tb_test_val;
execute 'select dialpeer_name,active into '||dialpeername||','||active_p||' from dialpeer where id = '||NEW.id_dp;
--dialpeername := (select dialpeer_name::varchar from dialpeer where id = NEW.id_dp);
--active_p := (select active::integer from dialpeer where id = NEW.id_dp);
--'test_dp';
insert into tb_test_val (text_f) values (NEW.id_dp::text);
insert into tb_test_val (text_f) values (dialpeername);
insert into tb_test_val (text_f) values (active_p);
--if (active_p>0) then act = null; else act = '#_'; end if;
--gw_cfg = lower('[db_'||replace(gw_descr, ' ', '_')||'_'||NEW.id_gateway||']\n');
dp_cfg := lower('[db_'||replace(dialpeername::text, ' ', '_')::text||'_'||NEW.id_dp||']\n')::text;--act||
--dp_cfg = 'test\n';
insert into tb_test_val (val) values (dp_cfg);
insert into tb_test_val (val) values (dialpeername);
OPEN cfg_curs_pr;
LOOP
FETCH cfg_curs_pr INTO par_parametr_name,par_parametr_value,ss_id;IF NOT FOUND THEN EXIT; END IF;
dp_cfg = dp_cfg || par_parametr_name || par_parametr_value||'\n';--||act
END LOOP;
CLOSE cfg_curs_pr;
--insert into tb_test_val (text_f) values (dp_cfg);
cnt_par = 0;
select count(*) into cnt_par from tb_dialpeer_db_cfg where id_dp = NEW.id_dp and id_ss = NEW.id_ss;
if(cnt_par>0) then update tb_sw_dp_cfg set config=dp_cfg where id_dp = NEW.id_dp and id_sw=NEW.id_ss;END IF;
RETURN NEW;
END;
...
Рейтинг: 0 / 0
select into
    #33601482
4_Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сделал как в доке,
SELECT INTO dp_r * FROM dialpeer WHERE id = NEW.id_dp;
тот же результат, вот ещё сам тригер где сидит, чтобы не думали что он селектит из той же таблицы куда вставляет:)

Код: 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.
CREATE TRIGGER trgr_insert_dialpeer_config_tb
  AFTER INSERT
  ON tb_dialpeer_db_cfg
  FOR EACH ROW
  EXECUTE PROCEDURE update_dialpeer_config_tb();


-- Function: update_dialpeer_config_tb()

-- DROP FUNCTION update_dialpeer_config_tb();

CREATE OR REPLACE FUNCTION update_dialpeer_config_tb()
  RETURNS "trigger" AS
$BODY$DECLARE ---NOT USED
--generate NEW.id_dp DP cfg_curs_pr
cfg_curs_pr CURSOR FOR select par.parametr_name,cfg.parametr, cfg.id_ss from tb_dialpeer_db_cfg cfg,tb_parametr_cfg par
where cfg.id_parametr  =  par.id and cfg.id_dp=NEW.id_dp and cfg.id_ss = NEW.id_ss order by par.id;
dp_cfg text;
par_parametr_name varchar;
par_parametr_value varchar;
group_name varchar;
cfg_id integer; active_p integer;
dialpeername varchar( 200 );act varchar;
cnt integer; cnt_par integer;
def_ss_id integer;ss_id integer;id integer;
dp_r RECORD;
BEGIN
delete from tb_test_val;
--select dialpeer_name,active into dialpeername,active_p from dialpeer where id = NEW.id_dp;
SELECT INTO dp_r * FROM dialpeer WHERE id = NEW.id_dp;
--dialpeername := (select dialpeer_name::varchar from dialpeer where id = NEW.id_dp);
--active_p := (select active::integer from dialpeer where id = NEW.id_dp);
--'test_dp';
insert into tb_test_val (text_f) values (NEW.id_dp::text);
insert into tb_test_val (text_f) values (dp_r.dialpeer_name);
insert into tb_test_val (text_f) values (dp_r.active);
--if (active_p>0) then act = null; else act = '#_'; end if;
--gw_cfg = lower('[db_'||replace(gw_descr, ' ', '_')||'_'||NEW.id_gateway||']\n'); 
dp_cfg := lower('[db_'||replace(dialpeername::text, ' ', '_')::text||'_'||NEW.id_dp||']\n')::text;--act||
--dp_cfg = 'test\n';
insert into tb_test_val (val) values (dp_cfg); 
insert into tb_test_val (val) values (dialpeername);
  OPEN cfg_curs_pr;
    LOOP
      FETCH cfg_curs_pr INTO par_parametr_name,par_parametr_value,ss_id;IF NOT FOUND THEN EXIT; END IF;    
      dp_cfg = dp_cfg || par_parametr_name || par_parametr_value||'\n';--||act
     insert into tb_test_val (text_f) values (par_parametr_name); 
     insert into tb_test_val (text_f) values (dp_cfg);
     insert into tb_test_val (text_f) values (par_parametr_value);
    END LOOP;
  CLOSE cfg_curs_pr;
--insert into tb_test_val (text_f) values (dp_cfg);
cnt_par =  0 ;
select count(*) into cnt_par from tb_dialpeer_db_cfg where id_dp = NEW.id_dp and id_ss = NEW.id_ss;
if(cnt_par> 0 ) then update tb_sw_dp_cfg set config=dp_cfg where id_dp = NEW.id_dp and id_sw=NEW.id_ss;END IF;
RETURN NEW;
END;$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION update_dialpeer_config_tb() OWNER TO alex;
...
Рейтинг: 0 / 0
select into
    #33601563
4_Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сам с собой....
решил, оформил этот селект в функцию, но сильно подозреваю что можно и без этого обойтись, кто то в курсе как?
...
Рейтинг: 0 / 0
select into
    #33601681
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и я должен догадаться, что за "тот же результат" вы получаете?


кстати, возможно думать у вас попросту нет dialpeer-ов с нужным id (в момент исполнения триггера). Киньте еще и каунт от них в эту вашу таблицу логов - для проверки.


еще один способ - расставьте нотисы в подозрительных местах, и следите за содержимым переменных в процессе выполнения, а не через сомнительную табличку лога. (была завершена транза/ не была - нотисы пройдут).
...
Рейтинг: 0 / 0
select into
    #33601796
4_Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
4321и я должен догадаться, что за "тот же результат" вы получаете?


кстати, возможно думать у вас попросту нет dialpeer-ов с нужным id (в момент исполнения триггера). Киньте еще и каунт от них в эту вашу таблицу логов - для проверки.


еще один способ - расставьте нотисы в подозрительных местах, и следите за содержимым переменных в процессе выполнения, а не через сомнительную табличку лога. (была завершена транза/ не была - нотисы пройдут).

insert into tb_test_val (text_f) values (NEW.id_dp::text);
есть такой айди, я же написал выше что оформив запрос как функцию всё заработало, результат тригера не важен, важен тот факт что переменные не передыються запросом типа
select dialpeer_name,active into dialpeername,active_p from dialpeer where id = NEW.id_dp;

NEW.id_dp не нулевое, insert into tb_test_val (text_f) values (NEW.id_dp::text)
инсертит вполне реальное значение
...
Рейтинг: 0 / 0
select into
    #33601867
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по моему тупому мнению, dialpeer.id в конструкции
from dialpeer where id = NEW.id_dp;
несколько отличаецца от этого самого NEW.id_dp; (которое вы проверяете), а именно на вероятность его отсутствия в табле именно в момент транзакции, а не в каком то отдельно исполняемом запросе.
...
Рейтинг: 0 / 0
select into
    #33602120
4_Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
4321по моему тупому мнению, dialpeer.id в конструкции
from dialpeer where id = NEW.id_dp;
несколько отличаецца от этого самого NEW.id_dp; (которое вы проверяете), а именно на вероятность его отсутствия в табле именно в момент транзакции, а не в каком то отдельно исполняемом запросе.

с этим всё ОК, проверенно
...
Рейтинг: 0 / 0
select into
    #33602441
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4_Alex 4321по моему тупому мнению, dialpeer.id в конструкции
from dialpeer where id = NEW.id_dp;
несколько отличаецца от этого самого NEW.id_dp; (которое вы проверяете), а именно на вероятность его отсутствия в табле именно в момент транзакции, а не в каком то отдельно исполняемом запросе.

с этим всё ОК, проверенно"не верю"
(сам накалывался на ошибке логики при нескольких триггерах, т.ч. и вам не поверю )

- выдайте нотис или по количеству записей, а лучше - с самой записью - т.е. со всеми ее полями через запятую - прямо из триггера , прямо из того места, где у вас не получаицца присвоить, и не чешите моск.

Если же нотис напишет, шо запись получена, а следом, другой нотис, - что ее поля не присвоились переменным - то просьба оформить сообщение о баге (баги бывают, но кааца не в вашем случае) со всем сопутствующим "окружением" - мне интересно не наступать на чужой грабель.
...
Рейтинг: 0 / 0
select into
    #33602467
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я вже не просто так не верю.
Я попросту проверил:
Код: 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.
CREATE OR REPLACE FUNCTION f_test_into()
  RETURNS SETOF test AS
$BODY$
declare
	_rec RECORD;
	_rec1 RECORD;
	_rec2 test%ROWTYPE;

	_id int4;
	_name varchar( 64 );
	_number int4;
	_todo bool;
begin
	SELECT INTO _rec * FROM test WHERE test.id =  1 ;
	RETURN next _rec;
	SELECT id, name, number, todo INTO _id, _name, _number, _todo FROM test WHERE test.id =  1 ;

	_rec2 := ROW(_id::int4, _name, _number::int4, _todo);

	RETURN next  _rec2;
	FOR _rec1 IN  SELECT  * FROM test WHERE test.id =  1  
	LOOP
	
		RETURN next _rec1;
	end loop;
	RETURN;
end;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
-----
SELECT * FROM f_test_into();
---
 1 ;"asasa"; 4 ;f
 1 ;"asasa"; 4 ;f
 1 ;"asasa"; 4 ;f
как видите, усё присваиваицца (8.0.1), независимо от способа (синтаксиса) присвоения. Т.ч. скорее всего (если не вышибает на ошибку), проблема не с присвоением, а с отсутствием данных.
...
Рейтинг: 0 / 0
select into
    #33602597
4_Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
select dialpeer_name,active into dialpeername,active_p from dialpeer where id =  108441 ;--NEW.id_dp;

те вставил реальное значение 108441, версия у меня 8.1.2
а как нотайсы выводить, дайте один пример.
Спасибо.
...
Рейтинг: 0 / 0
select into
    #33602678
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нотисы? - вот кстати я баг тестировал (в 7.4. он есть , в 8.0 и 8.1. его нет)
Код: 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.
CREATE OR REPLACE FUNCTION f_test_distinct()
  RETURNS SETOF bool AS
$BODY$
declare
	_res bool;
	_tmp int4;
	_tmp1 int4;
	_rec RECORD;
	_rec1 RECORD;
begin 
	_res :=  1  IS DISTINCT FROM  2 ;
	RAISE NOTICE '1 IS DISTINCT FROM 2 %' , _res;
	RETURN NEXT _res;
	_res :=  1  IS DISTINCT FROM  1 ;
	RAISE NOTICE '1 IS DISTINCT FROM 1 %' , _res;

	_tmp:= 1 ; _tmp1:= 2 ;
	RETURN NEXT _res;
	_res := _tmp  IS DISTINCT FROM _tmp1;
	RAISE NOTICE '_tmp:=1  IS DISTINCT FROM _tmp1:=2 %' , _res;

	_tmp:= 1 ; _tmp1:= 1 ;
	RETURN NEXT _res;
	_res := _tmp  IS DISTINCT FROM _tmp1;
	RAISE NOTICE '_tmp:=1  IS DISTINCT FROM _tmp1:=1 %' , _res;
	RETURN NEXT _res;

	_tmp:= 1 ; _tmp1:= 2 ;
	_res := ROW(_tmp, 1 )  IS DISTINCT FROM (_tmp1, 1 );
	RAISE NOTICE 'ROW(_tmp:=1,1)  IS DISTINCT FROM ROW(_tmp1:=2,1) %' , _res;
	RETURN NEXT _res;

	_res := ROW( 1 , 1 )  IS DISTINCT FROM ( 2 , 2 );
	RAISE NOTICE 'ROW(1,1)  IS DISTINCT FROM (2,2) %' , _res;
	RETURN NEXT _res;
return;
end;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
...
Рейтинг: 0 / 0
select into
    #33603417
4_Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>NOTICE: select dialpeer_name<NULL>

...
Код: plaintext
1.
select dialpeer_name,active into dialpeername,active_p from dialpeer where id =  108441 ;--NEW.id_dp;
RAISE NOTICE 'select dialpeer_name%' , dialpeername;
...

как ещё можно проверить?
...
Рейтинг: 0 / 0
select into
    #33603434
4_Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а ещё вот так:
>NOTICE: select dialpeer_name<NULL>
....
Код: plaintext
1.
select 'wwwqqq',active into dialpeername,active_p from dialpeer where id =  108441 ;--NEW.id_dp;
RAISE NOTICE 'select dialpeer_name%' , dialpeername;
.....
...
Рейтинг: 0 / 0
select into
    #33603468
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не торопитесь:
Код: plaintext
1.
select id into dialpeername from dialpeer where id =  108441 ;--NEW.id_dp;
RAISE NOTICE 'select dialpeer_name%' , dialpeername;
если не доверяете SELECT INTO, то

Код: plaintext
1.
dialpeername :=( select id from dialpeer where id =  108441 );--NEW.id_dp;
RAISE NOTICE 'select dialpeer_name%' , dialpeername;
в конце концов
Код: plaintext
1.
dialpeername :=( select count(*) from dialpeer where id =  108441 )
RAISE NOTICE 'select dialpeer_name%' , dialpeername;
потом уже будете обижжаться
...
Рейтинг: 0 / 0
select into
    #33603536
4_Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>NOTICE: select id =<NULL>
>NOTICE: select count =0
Код: plaintext
1.
2.
3.
dialpeername :=( select id from dialpeer where id =  108441 );--NEW.id_dp;
RAISE NOTICE 'select id =%' , dialpeername;
dialpeername :=( select count(*) from dialpeer where id =  108441 );
RAISE NOTICE 'select count =%' , dialpeername;

отдельно

select id from dialpeer where id = 108441
select count(*) from dialpeer where id = 108441

дают 108441 и 1 соответственно,
счас бубны достану и начну танцевать:)
...
Рейтинг: 0 / 0
select into
    #33604329
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как вариант dialpeer не содержит этого id во время транзакции, ибо:

1. создана одноименная, но темповая таблица в транзакции, именно она и видна под именем dialpeer из транзакции

2. есть несколько схем (или даже баз) с одноименными таблицами. Вручную вы опрашиваете не ту, что в транзакции (1 - специфич. подслучай 2)

3. таки ошибка в логике (в момент транзакции вы где-то по ходу дропаете запись), что маловероятно - ведь вы, кажецца, опрашиваете уже некую конкретную запись, а не ту, с которой активно работаете в транзакции.
...
Рейтинг: 0 / 0
select into
    #33606835
4_Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
4321как вариант dialpeer не содержит этого id во время транзакции, ибо:

1. создана одноименная, но темповая таблица в транзакции, именно она и видна под именем dialpeer из транзакции

2. есть несколько схем (или даже баз) с одноименными таблицами. Вручную вы опрашиваете не ту, что в транзакции (1 - специфич. подслучай 2)

3. таки ошибка в логике (в момент транзакции вы где-то по ходу дропаете запись), что маловероятно - ведь вы, кажецца, опрашиваете уже некую конкретную запись, а не ту, с которой активно работаете в транзакции.

1,3 отпадает, а вот 2 так и есть, есть тестовая схема с такими же талицами, те мне надо указывать имясхемы.dialpeer?
...
Рейтинг: 0 / 0
select into
    #33606842
4_Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
dialpeername :=( select dialpeer.dialpeer_name from dialpeer where dialpeer.id =  108441 );--NEW.id_dp;voipswitch.public.
RAISE NOTICE 'select id =%' , dialpeername;
dialpeername :=( select count(*) from dialpeer where dialpeer.id =  108441 );--voipswitch.public.
RAISE NOTICE 'select count =%' , dialpeername;

спасло вот так, как всё оказалось просто
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / select into
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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