【问题标题】:Function returns "query has no destination for result data"函数返回“查询没有结果数据的目的地”
【发布时间】:2013-06-08 02:33:48
【问题描述】:

我正在尝试创建一个函数,该函数将有效地用作 UPSERT,并返回 0 表示成功的 UPDATE 或返回新记录的 id 表示成功的 INSERT。虽然该函数将成功创建,但当我尝试运行它时出现以下错误:

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;

【问题讨论】:

    标签: postgresql postgresql-9.1 plpgsql


    【解决方案1】:

    我认为你的问题是你的更新:

    UPDATE users_addresses ... RETURNING id;
    

    有一个 RETURNING 但你没有告诉它返回值应该去哪里。那是没有结果目的地的查询。如果你想要id,那么你需要把它放在某个地方:

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

    您当然会使用真实的变量名并正确声明它,somewhere 仅用于说明目的。

    或者,由于您不在乎 UPDATE 发现的 id 是什么,因此只需放弃 RETURNING id 并只使用 found 特殊变量即可:

    UPDATE users_addresses SET ... WHERE id = $1;
    IF found THEN
        RETURN 0;
    END IF;
    -- ...
    

    【讨论】:

    • 天啊!更有理由校对我正在做的事情,对吧?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多