Postgresql中函数的问题

wgxvkvu9  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(1)|浏览(110)

在基于Postgresql的SUPABASE函数中,我想写一个函数,将客户的名称作为输入,然后在函数的主体中实现此逻辑,如果客户尚未创建,则将其插入到客户表中,然后存储其ID并创建订单行,如果客户已经存在,则存储其ID然后创建订单
函数如下:

create or replace function FUNC_new_order(name text , qty int)
returns void as 
$$
begin
    declare CSID int ; 
    select customer_id into CSID from customer where customer_name = name ; 
    if NOT FOUND then 
    insert into customer(customer_name) values(name);
    select customer_id into CSID from customer where customer_name = name ; 
    --create order 
    insert into "order"(customer_id , order_qty)values(CSID, qty);

end;
$$
language plpgsql ;

字符串
但在supply-up中,它返回以下错误:

ERROR:  42601: syntax error at or near "into"
LINE 22:    select customer_id into CSID from customer where customer_name = name ; 
                               ^
CONTEXT:  invalid type name "customer_id into CSID from customer where customer_name "

dphi5xsq

dphi5xsq1#

使用postgres,无论客户是否存在,您都可以在一个查询中插入两个表。
test customer和数量= 500的示例

WITH SelectedCustomer AS (
INSERT INTO Customer(customer_name) VALUES ('test customer') ON CONFLICT DO NOTHING RETURNING customer_id
)
INSERT INTO "order"
SELECT customer_id, 500 FROM SelectedCustomer;

字符串
如您所见,查询使用了以下组合:

  • ON CONFLICT DO NOTHING:假设customer_nameunique,如果新客户端违反了唯一性约束,则不要插入新客户端。
  • RETURNING customer_id:是否插入客户,给予我对应的customer_id
  • CTE在将记录插入order表时将所有内容放在一起(我相信您已经知道,根据您在问题中被迫引用它的方式,这是一个可怕的表名;我建议您至少将其重命名为customer_order)。

我让你把这个查询放到你的函数中,如果你愿意,你可以添加一个RETURNING order_id子句来获取创建订单的id。

相关问题