postgresql - Postgres : unable to create function

标签 postgresql

我需要编写一个非常简单的函数。我将传递三个参数(employeeid、employeetitle 和employeeaddress)。如果传递的 employeeid 等于 0,则将向表中插入一条新记录。如果传递的 employeeid 大于 0,则记录将被更新。在这两种情况下,employeeid 都将作为结果返回(id 是 employee 表中的自动递增值)。我正在使用 pgAdmin,这是我编写的代码:

CREATE FUNCTION public.addupdateemployee(IN employeeid bigint, IN employeetitle text, IN employeeaddress text)
RETURNS bigint
LANGUAGE 'plpgsql'

AS $BODY$
BEGIN
DECLARE affectedrecordid bigint = 0
IF employeeid = 0 THEN
INSERT INTO employeemaster(title, address)
values(employeetitle, employeeaddress)
RETURNING id INTO affectedrecordid;
RETURN affectedrecordid;
ELSE
UPDATE employeemaster 
SET title = employeetitle,
address = employeeaddress
WHERE id = employeeid  
RETURN employeeid;
END IF
END
$BODY$;

当我执行上述语句时出现以下错误:

ERROR:  syntax error at or near "IF"
LINE 8: IF employeeid = 0 THEN
        ^
SQL state: 42601
Character: 218

我无法弄清楚这个问题。有人可以帮我修复上述功能吗?

最佳答案

declare 需要在第一个begin 之前进行。而且您缺少变量声明的 ;IF block 之后。语言名称是一个标识符,不应放在单引号中。并且 UPDATE 语句需要 RETURNING 而不是 RETURN

所以应该是:

CREATE FUNCTION public.addupdateemployee(IN employeeid bigint, IN employeetitle text, IN employeeaddress text)
  RETURNS bigint
  LANGUAGE plpgsql
AS $BODY$
DECLARE 
  affectedrecordid bigint = 0;
begin  
  IF employeeid = 0 THEN
    INSERT INTO employeemaster(title, address)
    values(employeetitle, employeeaddress)
    RETURNING id INTO affectedrecordid;
    RETURN affectedrecordid;
  ELSE
    UPDATE employeemaster 
      SET title = employeetitle,
        address = employeeaddress
    WHERE id = employeeid  
    RETURNING employeeid;
  END IF;
END;
$BODY$;

关于postgresql - Postgres : unable to create function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54763200/

相关文章:

postgresql - 无法连接到 PostgreSQL

postgresql - 如果我想节省空间,是否必须创建代理键?

sql - Postgres : array_agg throws 'cannot accumulate empty arrays' for empty array(s)

postgresql - ALTER COLUMN 在具有访问锁的表上

postgresql - Postgres更新

sql - Django prefetch_related 与限制

postgresql - 如何更新同一张表中的分层数据

ruby-on-rails - Postgres sh :/usr/local/var/postgres/server. 日志:没有那个文件或目录

postgresql - 使用 UNION ALL 从多个表中获取行或在生产中使用一个表?

arrays - 选择整数数组数组的每个第一个元素进行数组