powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / plpgsql - не могу найти ошибку в функции
7 сообщений из 7, страница 1 из 1
plpgsql - не могу найти ошибку в функции
    #33532759
ZiNTeR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем есть такая функция:
-- Function: set_last()

-- DROP FUNCTION set_last();

CREATE OR REPLACE FUNCTION set_last()
RETURNS "trigger" AS
$BODY$declare
is_true boolean;
par_id integer;
begin
if (NEW.is_last != TRUE) then
NEW.is_last= TRUE;
end if;
if (NEW.parent_id = 0) then
RETURN NEW;
exit;
end if;
is_true=(SELECT is_last from categories where cat_id=NEW.parent_id);
par_id=NEW.parent_id;
if (is_true=TRUE) then
UPDATE categories SET is_last = FALSE;
--raise notice "не введено";
end if;
RETURN NEW;
end;

$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION set_last() OWNER TO postgresql;
Вроде бы кое как работает, но только комманда, выделенная жирным не выполняется. Не понятно почему. Ведь из триггерной функции можно же выполнять запросы?
Также когда передаю явное значение is_last (будь то true или false) тоже появляется какая то ошибка.
В общем - недавно сел за postgres(с Mysql) и не жалею о выпавших волосах..
...
Рейтинг: 0 / 0
plpgsql - не могу найти ошибку в функции
    #33532812
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
что значит не выполняется?
и какая ошибка появляяется?
как создаете тригер?
...
Рейтинг: 0 / 0
plpgsql - не могу найти ошибку в функции
    #33533642
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
NEW.is_last  := TRUE;
is_true      := (SELECT is_last from categories where cat_id=NEW.parent_id);
par_id       := NEW.parent_id;

Двоеточия
...
Рейтинг: 0 / 0
plpgsql - не могу найти ошибку в функции
    #33534515
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Funny_Falcon
Код: plaintext
1.
2.
NEW.is_last  := TRUE;
is_true      := (SELECT is_last from categories where cat_id=NEW.parent_id);
par_id       := NEW.parent_id;

Двоеточия

С 8 версии и "=" работает.

А не пытается ли уважаемый рекурсивно апдейтить таблицу?
...
Рейтинг: 0 / 0
plpgsql - не могу найти ошибку в функции
    #33535215
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZiNTeRВ общем есть такая функция:
-- Function: set_last()

-- DROP FUNCTION set_last();

CREATE OR REPLACE FUNCTION set_last()
RETURNS "trigger" AS
$BODY$declare
is_true boolean;
par_id integer;
begin
if (NEW.is_last != TRUE) then
NEW.is_last= TRUE;
end if;
if (NEW.parent_id = 0) then
RETURN NEW;
exit;
end if;
is_true=(SELECT is_last from categories where cat_id=NEW.parent_id);
par_id=NEW.parent_id;
if (is_true=TRUE) then
UPDATE categories SET is_last = FALSE;
--raise notice "не введено";
end if;
RETURN NEW;
end;

$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION set_last() OWNER TO postgresql;
Вроде бы кое как работает, но только комманда, выделенная жирным не выполняется. Не понятно почему. Ведь из триггерной функции можно же выполнять запросы?
Также когда передаю явное значение is_last (будь то true или false) тоже появляется какая то ошибка.
В общем - недавно сел за postgres(с Mysql) и не жалею о выпавших волосах..естли я прально понимаю, то Постле строки жирным, идет апдейт другой записи ТОЙ же таблицы (дерево, и я его уже где-то видел ), а при ее апдейте срабатывает этот же триггер, но для уже той записи, но поскольку вы пвтаетесь жирно SET is_last = FALSE, то и отрабатыват его _ПЕРВАЯ_ часть (IF (NEW.is_last != TRUE) , которая делает
NEW.is_last = TRUE. Только и всего. Т.е. надо разделять логику вставки и логику апдейта.
...
Рейтинг: 0 / 0
plpgsql - не могу найти ошибку в функции
    #33538514
ZiNTeR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ок. Спасибо - задача решена. Кстати, интересно, где эту задачу уже видели то?
...
Рейтинг: 0 / 0
plpgsql - не могу найти ошибку в функции
    #33539345
4321ё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я видел не "задачу" (которой в упор не вижу и теперь) а структурку, и даже именование таблиц и полей. Видимо общность подходов.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / plpgsql - не могу найти ошибку в функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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