如何在postgres的触发器中从表中选择多行

问题描述 投票:0回答:2

我正在尝试编写一个触发器,从另一个表获取数据(多行)后,我必须在其中创建一个Json。我有两个表任务和数据。数据表包含有关键/值对中任务的多个信息。

 task schema
 taskid
 description 
 value

数据表架构

  id
  taskid
  key
  value

现在在触发器中,我想获取与任务相对应的所有数据,并从中准备一个JSON。我在下面使用

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

        DECLARE
        _eventType varchar:='Task';
        _jsondata json;
        _message json; 
        _entity 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;

      _entity:= json_build_object('entity',_eventType);
      _jsondata := json_build_object('event',_entity,'payload',_message);

       INSERT INTO events(message)
       VALUES(_jsondata);

       RETURN NULL;
       END;

        $BODY$
LANGUAGE plpgsql VOLATILE

这里,我正在使用下面的查询从对应于taskid的数据表中获取所有数据

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

这里,问题是我只能得到一行。如何获取所有行?如果有人有什么想法?

postgresql plpgsql database-trigger
2个回答
0
投票

您可以将所有内容聚合为一个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;
...

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

    DECLARE
    _eventType varchar:='Task';
    _jsondata json;
    _message json; 
    _entity 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;

  _entity:= json_build_object('entity',_eventType);
  _jsondata := json_build_object('event',_entity,'payload',_message);

   INSERT INTO events(message)
   VALUES(_jsondata);

   RETURN NULL;
   END;

    $BODY$
  LANGUAGE plpgsql VOLATILE 

研究链接:select statement in postgres function called inside a trigger

© www.soinside.com 2019 - 2024. All rights reserved.