无法在 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 中执行或执行功能的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql 9.2执行pg_dump命令问题[重复]

postgresql如何执行sql文件

postgresql无法创建触发器

PostgreSQL如何导入数据

如何在 LLDB 调试器中调用方法或执行代码?

Centos 6.6 postgresql 错误:无法执行二进制文件