【问题标题】:PostgreSql : Not able to retrieve rows after inserting them into DB?PostgreSql:将行插入数据库后无法检索行?
【发布时间】:2020-10-12 22:46:51
【问题描述】:
CREATE OR REPLACE FUNCTION sp_post_items(i_data json)
 RETURNS table (fulfiller_id character varying,item_id character varying, order_id character varying, 
 status_id integer, 
-- sku_code character varying, decoration_technology character varying, quantity integer,  
 item_updated_time timestamp without time zone)

AS $function$
begin

 insert into vw_item_status_detail (fulfiller_id ,item_id ,order_id , status_id , sku_code ,
 decoration_technology ,quantity, item_updated_time)
 select 
    i_data->>'fulfillerId', 
    t->>'itemId', 
    i_data->>'orderId', 
    1000,
    t->>'skuCode',
    t->>'decorationTechnology',
    10,
    now()
  from json_array_elements(i_data  -> 'items') t
 returning fulfiller_id ,item_id ,order_id , status_id , item_updated_time;
 
-- returning fulfiller_id ,item_id ,order_id , status_id, item_updated_time;
 

end;
$function$
LANGUAGE plpgsql;

运行存储函数的示例数据

select * from post_items('{"orderId": "s",
 "fulfillerId":"kv0fdt6cx7",
"orderDetailsUrl":"het",
"items":[
    {
        "decorationTechnology":"laserEngraving","itemDescription":"Test Sku for Oracle testing",
"itemId":"aagasdsam1",
        "manufacturingUrl":"h-d9ccea00cn-prepress",
        "skuCode":"CIM-QYXB3789","productName":"Tsdacle testing","quantity":"225","taskId":"33a1sd769876c52"
    },
    {
         "decorationTechnology":"ssdas"
         "itemDescription":"Test Sku for satesting",
         "itemId":"aagam2",
         "manufacturingUrl":"httsadfa2d72-f225-4a03-addd-d9ccea00c874~1sadlpen-spress",
         "skuCode":"CXB3789",
         "productName":"Test Sku for Oracle testing",
         "quantity":"225",
         "taskId":"33asad6c52"
    }
]
}'::json)

当我尝试运行时,函数值被插入到数据库中,但没有收到任何回报。

预期输出 返回Stored函数返回查询中提到的参数

尝试了多种方法,但总是没有输出

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    你需要添加:

    ...
    returning fulfiller_id ,item_id ,order_id , status_id , item_updated_time;
    RETURN NEXT;
    RETURN;
    
    ...
    

    从这里开始:

    https://www.postgresql.org/docs/12/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-RETURNING

    42.6.1.2。返回下一个并返回查询

    RETURN NEXT 和 RETURN QUERY 实际上并不从函数返回——它们只是将零或多行附加到函数的结果集中。然后继续执行 PL/pgSQL 函数中的下一条语句。随着连续的 RETURN NEXT 或 RETURN QUERY 命令被执行,结果集被建立起来。最后的 RETURN 应该没有参数,导致控制退出函数(或者你可以让控制到达函数的末尾)。 .

    RETURNS tableRETURNS setof 的别名,因此您需要使用RETURN NEXT 返回一个集合。

    更新

    我的错。我想我记得RETURN NEXT 会自动提取出变量。要完成这项工作,您需要将RETURNING 中的值分配给RETURN NEXT 之前的out(table) 变量。例如:

    \d names
                           Table "public.names"
     Column |          Type          | Collation | Nullable | Default 
    --------+------------------------+-----------+----------+---------
     id     | integer                |           | not null | 
     name   | character varying(200) |           | not null | 
     animal | character varying(200) |           | not null | 
    Indexes:
        "names_pkey" PRIMARY KEY, btree (id)
    
    CREATE OR REPLACE FUNCTION public.return_test(id_in integer, name_in character varying, animal_in character varying)
     RETURNS TABLE(id_out integer, name_out character varying, animal_out character varying)
     LANGUAGE plpgsql
    AS $function$
    
    BEGIN
    
        INSERT INTO
            names (id, name, animal)
        VALUES
            (id_in, name_in, animal_in)
        RETURNING id, name, animal INTO id_out, name_out, animal_out;
    
    RETURN NEXT;
    RETURN;
    END;
    
    $function$
    
    
    select * from  return_test(1, 'ranger', 'dog');
    
     id_out | name_out | animal_out 
    --------+----------+------------
          1 | ranger   | dog
    (1 row)
    
    
    

    【讨论】:

    • 所以我需要追加 - RETURN NEXT;返回; - 即使在那之后我也没有输出
    • 参见更新
    • 也是关于名称冲突的仅供参考。您可能需要在INSERT 中为表名设置别名,并在RETURNING 子句中使用别名。否则,TABLE 输出的列名可能会出现重复名称错误。
    猜你喜欢
    • 1970-01-01
    • 2014-08-08
    • 2020-01-19
    • 2017-09-19
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多