Как можно выбрать несколько строк из таблицы в триггерах в postgres - PullRequest
0 голосов
/ 14 апреля 2020

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

 task schema
 taskid
 description 
 value

схема таблицы данных

  id
  taskid
  key
  value

Теперь в триггере я хочу получить все данные, соответствующие задаче, и подготовить JSON от этого. Я использую ниже

 CREATE OR REPLACE FUNCTION event()
  RETURNS trigger AS
     $BODY$

        DECLARE
         _message json; 
         _data data;

         BEGIN

         SELECT * INTO _data FROM data WHERE data.taskid = New.taskid;
          IF      TG_OP = 'INSERT' THEN
                          _messag:=json_build_object('taskId',NEW.taskid,'description',NEW.description,'value',NEW.value,'clientis',_data);

          END IF;


       INSERT INTO events(message)
       VALUES(_messag);

       RETURN NULL;
       END;

        $BODY$
LANGUAGE plpgsql VOLATILE

Здесь я использую запрос ниже, чтобы получить все данные из таблицы данных, соответствующей taskid

SELECT * INTO _data FROM data WHERE data.taskid = New.taskid;

Здесь проблема в том, что я получаю только один ряд Как можно получить все строки? Если у кого есть идеи?

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Это работает для меня:

CREATE OR REPLACE FUNCTION event()
 RETURNS trigger AS
 $BODY$

    DECLARE
    _message json; 
    _data jsonb;

     BEGIN

   *****SELECT json_agg(tmp)  
    INTO _data
  FROM (
    -- Your subquery goes here, for example:
    SELECT data.key, data.value
    FROM.data
    WHERE data.taskid = New.taskid
    ) tmp;*****

      IF      TG_OP = 'INSERT' THEN
                      _messag:=json_build_object('taskId',NEW.taskid,'description',NEW.description,'value',NEW.value,'clientis',_data);

      END IF;

   INSERT INTO events(message)
   VALUES(_messag);

   RETURN NULL;
   END;

    $BODY$
  LANGUAGE plpgsql VOLATILE 

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

0 голосов
/ 14 апреля 2020

Вы можете объединить все в одно JSON значение:

declare
...
  _data jsonb; --<< change the data type to jsonb
begin
...
IF TG_OP = 'INSERT' THEN
  -- only select everything if you really need it
  SELECT jsonb_agg(to_jsonb(data)) 
    INTO _data 
  FROM data 
  WHERE data.taskid = New.taskid;

  _message := json_build_object('taskId',NEW.taskid,'description',NEW.description,'value',NEW.value,'clientis',_data);
END IF;
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...