多行的Postgres声明类型

问题描述

我有一个使用%ROWTYPE声明的postgres函数。当我执行此功能时,我无法返回多于一行"code":"P0003","message":"query returned more than one row"

我可以成功执行查询而无需使用returning * into assignments;语句。哪个使我相信assignments data.assignment%ROWTYPE;仅适用于一行?

create or replace function assign(order_id int) returns json as $$
declare
 assignments data.assignment%ROWTYPE;
begin
        insert into data.assignment
        (order_item_id,pharmacy_id)
         (
               select oi.id as order_item_id,mci.pharmacy_id
               from api.order_items as oi
               inner join api.min_cost_inventory_items as mci on mci.drug_id = oi.drug_id
               where oi.order_id = $1
         )
        returning * into assignments;

        return json_build_object(
          'assignments',assignments
        );
end
$$ security definer language plpgsql;
revoke all privileges on function assign(int) from public;

解决方法

是的。 %ROWTYPE不是严格必需的,但是在任何情况下,它仅保留一行。您可以创建data.assignment[]的数组,但是然后需要循环填充它。

您可以简化功能,如下所示:

create or replace function assign(_order_id int) returns jsonb as $$
  with i as (
    insert into data.assignment
     (order_item_id,pharmacy_id)
    select oi.id as order_item_id,mci.pharmacy_id
      from api.order_items as oi
           inner join api.min_cost_inventory_items as mci 
                   on mci.drug_id = oi.drug_id
                where oi.order_id = _order_id
    returning *
  )
  select jsonb_agg(to_jsonb(i)) from i;
$$ security definer language sql;

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...