【问题标题】:Postgres declaration type for multiple rows多行的 Postgres 声明类型
【发布时间】:2020-12-01 09:16:08
【问题描述】:

我有一个使用 %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;

【问题讨论】:

    标签: sql postgresql stored-procedures stored-functions


    【解决方案1】:

    是的。 %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 见这里:stackoverflow.com/a/22306979/13808319
    • 这个查询似乎也抛出了一个错误:{"hint":"If you want to discard the results of a SELECT, use PERFORM instead.","details":null,"code":"42601","message":"query has no destination for result data"}
    • @kevzettler 你指定language sql了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多