我的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
如果发生更新,该函数将返回,否则返回某个值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句