Russian Qt Forum

Программирование => Базы данных => Тема начата: sergek от Февраль 03, 2015, 09:28



Название: [РЕШЕНО] NOTIFY с аргументом в PostgreSQL
Отправлено: sergek от Февраль 03, 2015, 09:28
Коллеги,
нужно в уведомлении NOTIFY передать, к примеру, значение поля для добавленной записи таблицы.
Примерно так:
Код:
CREATE FUNCTION wrequest_notify() RETURNS trigger AS $$
  BEGIN
NOTIFY wrequested, '1234';
RETURN NULL;
  END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER wrequest_after
AFTER  INSERT
ON wrequest
FOR EACH ROW
EXECUTE PROCEDURE wrequest_notify();
Обработка уведомлений в программе - http://majestio.tk/viewtopic.php?pid=38#p38
Только нужно передать не константу ('1234'), а значение переменной, например,
Код:
	NOTIFY wrequested, NEW.requestid;
но такое не допускается синтаксисом. Наверное, здесь могло бы помочь что-то типа макроподстановки. А как?


Название: Re: NOTIFY с аргументом в PostgreSQL
Отправлено: Old от Февраль 03, 2015, 10:06
Кастуйте ее строку и передавайте.


Название: Re: NOTIFY с аргументом в PostgreSQL
Отправлено: sergek от Февраль 03, 2015, 11:15
Если вы имеете в виду
Код:
NOTIFY wrequested, CAST(123 as varchar(10));
то пробовал, дает:
Код:
ОШИБКА:  ошибка синтаксиса (примерное положение: "CAST")
LINE 3:  NOTIFY wrequested, CAST(123 as varchar(10));
                            ^
********** Ошибка **********

ОШИБКА: ошибка синтаксиса (примерное положение: "CAST")
SQL-состояние: 42601
Символ: 85


Название: Re: NOTIFY с аргументом в PostgreSQL
Отправлено: Old от Февраль 03, 2015, 11:49
Вот так отправляйте:
PERFORM pg_notify( wrequested, param );

Где param - VARCHAR.


Название: Re: NOTIFY с аргументом в PostgreSQL
Отправлено: Johnik от Февраль 03, 2015, 11:57
Код:
ОШИБКА:  ошибка синтаксиса (примерное положение: "CAST")
LINE 3:  NOTIFY wrequested, CAST(123 as varchar(10));
                            ^
********** Ошибка **********

ОШИБКА: ошибка синтаксиса (примерное положение: "CAST")
SQL-состояние: 42601
Символ: 85
в pgsql кастуется по-другому:
Код:
select 123::varchar(10)


Название: Re: NOTIFY с аргументом в PostgreSQL
Отправлено: sergek от Февраль 03, 2015, 12:22
Спасибо огромное!
Вот окончательный вариант:
Код:
CREATE FUNCTION wrequest_notify() RETURNS trigger AS $$
  BEGIN
        PERFORM pg_notify( 'wrequested', NEW.requestid::varchar(10) );
RETURN NULL;
  END;
$$ LANGUAGE plpgsql;


Название: Re: [РЕШЕНО] NOTIFY с аргументом в PostgreSQL
Отправлено: Old от Февраль 03, 2015, 15:40
Спасибо огромное!
Я делаю следующим образом: первый параметр это название таблицы, а второй собирается из типа операции над записью и ее id.
Например:
"I:1010" - добавлена запись с id = 1010 (отправляется после добавления)
"U:100500" - обновлена запись с id = 100500 (отправляется после обновления)
"D:321" - будет удалена запись с id = 321 (отправляется перед удалением)
"R" - необходимо обновить таблицу (отправляется после удаления)

Модели подписываются на уведомления от соответствующих им таблиц и обновляют свое состояние согласно уведомлениям. Оператор видит все изменения происходящие с таблицей.