1

虽然我已经看到这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;

我做错了什么?

4

0 回答 0