Sql 多行的Postgres声明类型

Sql 多行的Postgres声明类型,sql,postgresql,stored-procedures,stored-functions,Sql,Postgresql,Stored Procedures,Stored Functions,我有一个postgres函数,它使用%ROWTYPE声明。执行此函数时,返回多行时出错“code”:“P0003”,“message”:“query returned more one row” 我可以成功地执行查询,而无需将*返回到作业中语句。这让我相信赋值数据。赋值%ROWTYPE仅适用于一行 create or replace function assign(order_id int) returns json as $$ declare assignments data.assignm

我有一个postgres函数,它使用
%ROWTYPE
声明。执行此函数时,返回多行时出错
“code”:“P0003”,“message”:“query returned more one row”

我可以成功地执行查询,而无需
将*返回到作业中语句。这让我相信
赋值数据。赋值%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;

这适用于这个特定的用例,但没有回答如何为一个集合或多个行声明变量这一更一般的问题。我想我以后还得再问一次。@kevzettler看这里:这个查询似乎也抛出了一个错误:
{“hint”:“如果你想放弃一个SELECT的结果,请改用PERFORM。”,“details”:null,“code”:“42601”,“message”:“查询没有结果数据的目标”}
@kevzettler您是否指定了
语言sql