我的 postgresql 数据库中有这个函数,如果存在则更新行,如果不存在则插入新行:
CREATE OR REPLACE FUNCTION insert_or_update(val1 integer, val2 integer) RETURNS VOID AS $$
DECLARE
BEGIN
UPDATE my_table SET col2 = val2 WHERE col1 = val1;
IF NOT FOUND THEN
INSERT INTO my_table (col2) values ( val2 );
END IF;
END;
$$ LANGUAGE 'plpgsql';
目前它工作完美,但如果更新或插入,我想获取行的 id
。
我该怎么做?
最佳答案
您的函数被声明为 returns void
因此它不能返回任何内容。
假设 col1
是主键并且也被定义为一个序列,你可以这样做:
CREATE OR REPLACE FUNCTION insert_or_update(val1 integer, val2 integer)
RETURNS int
AS $$
DECLARE
l_id integer;
BEGIN
l_id := val1; -- initialize the local variable.
UPDATE my_table
SET col2 = val2
WHERE col1 = val1; -- !! IMPORTANT: this assumes col1 is unique !!
IF NOT FOUND THEN
INSERT INTO my_table (col2) values ( val2 )
RETURNING col1 -- this makes the generated value available
into l_id; -- and this stores it in the local variable
END IF;
return l_id; -- return whichever was used.
END;
$$ LANGUAGE plpgsql;
与您的功能相比,我改变了四件事:
- 函数被声明为
returns integer
以便能够返回一些东西 - 您需要一个变量,您可以在其中存储
insert
语句的返回值 - 最后需要返回生成的值:
- 语言名称是一个标识符,因此不能用单引号引起来。
如果你想区分来自调用者的更新或插入,你可以将 l_id 初始化为 null
。在这种情况下,如果发生更新,该函数将返回 null
,否则返回一些值。
关于PostgreSQL 函数 : get id of updated or inserted row,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30233496/