2

UPSERT として効果的に機能し、UPDATE が成功した場合は 0 を返し、INSERT が成功した場合は新しいレコードの ID を返す関数を作成しようとしています。関数は正常に作成されますが、実行しようとすると次のエラーが発生します。

query has no destination for result data

私はこのように実行しています(データは明らかにマスクされています):

select public.mergeaddress(0, 2, 'XXX XX XXXX', 'XXXX', 'XX', 'XXXXX', true, true, -XXX.XXXXXX, XX.XXXXXXX);

ここで明らかな何かが欠けているに違いないことはわかっています。何かご意見は?

CREATE FUNCTION mergeAddress(integer, integer, varchar, varchar, varchar, varchar, boolean, boolean, float, float) RETURNS integer AS

$$

DECLARE new_id integer;

BEGIN
    LOOP
        UPDATE users_addresses SET users_id = $2, address_street = $3, address_city = $4, address_state = $5, address_zip = $6, is_private = $7, is_default = $8, long = $9, lat = $10 WHERE id = $1 RETURNING id;
        IF found THEN
            RETURN 0;
        END IF;
        BEGIN
            INSERT INTO users_addresses VALUES (DEFAULT, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING id INTO new_id;
            RETURN new_id;
        EXCEPTION WHEN unique_violation THEN
         -- Restart the loop
        END;
    END LOOP;
END;
$$
LANGUAGE plpgsql;
4

1 に答える 1

5

あなたの問題はあなたの更新だと思います:

UPDATE users_addresses ... RETURNING id;

RETURNING がありますが、その戻り値がどこに行くべきかを教えていません。これは、結果の宛先がないクエリです。が必要な場合は、次のid場所に配置する必要があります。

UPDATE users_addresses ... RETURNING id INTO somewhere;
-- -------------------------------------^^^^^^^^^^^^^^

もちろん、実際の変数名を使用して適切に宣言しますが、これsomewhereは説明のためのものです。

idまたは、 UPDATE が何を見つけたかは気にしないので、単に捨てて、特別な変数RETURNING idだけを気にします:found

UPDATE users_addresses SET ... WHERE id = $1;
IF found THEN
    RETURN 0;
END IF;
-- ...
于 2013-06-08T02:56:39.960 に答える