无法在 postgresql 中执行或执行功能
Posted
技术标签:
【中文标题】无法在 postgresql 中执行或执行功能【英文标题】:Can't execute or perform a funtion in postgresql 【发布时间】:2021-12-17 23:45:55 【问题描述】:我在执行 sum 函数时在 ")" 处或附近有语法错误,perform 也不起作用!
这是我的代码:
CREATE OR REPLACE FUNCTION sum() RETURNS VOID AS $$
declare
ea bigint;
BEGIN
FOR ea in select ean from ws_products where order_code like 'BIL%'
LOOP
insert into ws_products_margins (type, amount)values ('PERSENTAGE', 30.00) returning id;
update ws_products set margin_id = id where ean = ea;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql;
execute sum();
【问题讨论】:
函数使用select
执行,过程使用call
。
您的INSERT
没有意义,您将重复插入相同的值('PERSENTAGE',30.00),而不引用任何内容。仅供参考,它是“百分比”。同样在UPDATE
中,这个margin_id = id
将不起作用,因为您没有捕获从INSERT
返回的id
。为此,请参阅 Returnin INSERT ... RETURNING expressions INTO [STRICT] target;
【参考方案1】:
您需要将该 id 返回到您声明的变量中如 cmets 中正确提到的那样。
请注意变量名称已更新,以及“记录”变量的使用。
试试-
CREATE OR REPLACE FUNCTION sum() RETURNS VOID AS $$
declare
ea_id bigint;
j record;
BEGIN
FOR j in select ean from ws_products where order_code like 'BIL%'
LOOP
insert into ws_products_margins (type, amount)values ('PERCENTAGE', 30.00) returning id into ea_id;
update ws_products set margin_id = ea_id where ean = j.ean;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql;
【讨论】:
问题是您删除了ea bigint;
,这意味着FOR ea in ...
将不再起作用。 FOR
的目标需要声明为变量,参见Loop over Query。
@AdrianKlaver 正确提及,完全忽略了我的注意,感谢您指出,已进行必要的更正。以上是关于无法在 postgresql 中执行或执行功能的主要内容,如果未能解决你的问题,请参考以下文章