虽然我已经看到这upsert
将成为 的一部分Postgresql 9.5
,但我正在尝试编写我的(我使用PostgreSQL 9.4
)并且我不明白我得到了无限递归:函数重试无限地插入行。
当我尝试在 a 的情况下返回已经存在的行的 id 时出现问题unique violation
(即,如果我 return VOID
,它可以工作)。
这是功能:
CREATE OR REPLACE FUNCTION upsertAddress(
geographicPointValue VARCHAR(63),
cityValue VARCHAR(127),
zipValue VARCHAR(15),
streetValue VARCHAR)
RETURNS INT AS
$$
DECLARE addressIdToReturn int;
BEGIN
LOOP
UPDATE addresses
SET geographicPoint = POINT(geographicPointValue), city = cityValue, zip = zipValue, street = streetValue
WHERE city = cityValue AND zip = zipValue AND street = streetValue;
IF found THEN
SELECT addressId INTO addressIdToReturn
FROM addresses
WHERE city = cityValue AND zip = zipValue AND street = streetValue;
RETURN addressIdToReturn;
END IF;
BEGIN
INSERT INTO addresses (geographicPoint, city, zip, street)
VALUES (POINT(geographicPointValue), cityValue, zipValue, streetValue)
RETURNING addressId INTO addressIdToReturn;
RETURN addressIdToReturn;
EXCEPTION WHEN unique_violation THEN
END;
END LOOP;
END;
$$
LANGUAGE plpgsql;
我做错了什么?