PSQL: отключение вывода вызова функции или его вызов без SELECT - PullRequest
3 голосов
/ 23 августа 2011

В Postgresql у меня есть правило UPDATE для таблицы, которой нужно всего лишь вызвать функцию dctUpdate без выполнения всего оператора SQL, поскольку оператор SQL фактически выполняется в функции.Единственный известный мне способ вызова функции - это SELECT dctUpdate(windowId):

create or replace function infoUpdate(windowId in numeric) returns void as $$
begin
    if windowId is null then
        update info_timestamp set timestamp = now();
    else
        update info_timestamp set timestamp = now() where window_id = windowId;
    end if;
end;
$$ LANGUAGE plpgsql;


create or replace rule info_update_rule as on update to some_table do also select infoUpdate(NEW.window_id);

Однако в командной строке, когда запускается это правило, потому что я обновил строку в some_table, я получаю бесполезный выводиз предложения SELECT, вызывающего функцию:

db=# update some_table set name = 'foobar' where window_id = 1;
 infoupdate 
-----------

(1 row)

UPDATE 1

Есть ли способ заставить info_update_rule вызывать функцию infoUpdate без отображения фиктивного вывода?

Ответы [ 2 ]

1 голос
/ 24 августа 2011

Я не нашел вариантов для реализации этого с помощью правил, но есть альтернативный способ реализации этих триггеров usign.

Итак, вы определяете функцию триггера следующим образом:

CREATE OR REPLACE FUNCTION ur_wrapper_trg()
  RETURNS trigger AS
$BODY$
begin
    perform infoUpdate(NEW.window_id);
    RETURN NEW;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION ur_wrapper_trg() OWNER TO postgres;

Примечание * Используется синтаксис 1006 *PERFORM.Этот синтаксис идентичен синтаксису SELECT, за исключением того, что он подавляет все выходные данные.

Чем вы определяете триггер

CREATE TRIGGER some_table_utrg
  BEFORE UPDATE
  ON some_table
  FOR EACH ROW
  EXECUTE PROCEDURE ur_wrapper_trg();

В конце концов вы отменяете свое правило.

Не тестировался с null, но с фактическими windos_id с работает как ожидалось, без каких-либо нежелательных выходных данных.

Проконсультируйтесь с Триггерами и Правила против триггеров для подробного описания.

0 голосов
/ 20 октября 2014

Закрытое решение, к которому я пришел, это позвонить \t \a до select function() и сразу после него. Единственное, что осталось - это новая строка для каждого звонка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...