elf*_*sto 2 postgresql plpgsql postgresql-9.1
我正在尝试创建一个有效地充当UPSERT的函数,并返回0表示成功的UPDATE或者返回成功INSERT的新记录的id.虽然该函数将成功创建,但当我尝试运行它时会出现以下错误:
query has no destination for result data
Run Code Online (Sandbox Code Playgroud)
我正在以这种方式运行它(数据显然是掩盖的):
select public.mergeaddress(0, 2, 'XXX XX XXXX', 'XXXX', 'XX', 'XXXXX', true, true, -XXX.XXXXXX, XX.XXXXXXX);
Run Code Online (Sandbox Code Playgroud)
我知道我必须在这里遗漏一些明显的东西.有什么想法吗?
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;
Run Code Online (Sandbox Code Playgroud)
我认为你的问题是你的更新:
UPDATE users_addresses ... RETURNING id;
Run Code Online (Sandbox Code Playgroud)
有一个RETURNING但你没有告诉它返回值应该去哪里.这是没有结果目标的查询.如果你想要id那么你需要把它放在某个地方:
UPDATE users_addresses ... RETURNING id INTO somewhere;
-- -------------------------------------^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
您当然会使用真正的变量名称并正确声明它,somewhere仅用于说明目的.
或者,因为您不关心idUPDATE发现的是什么,只需抛弃RETURNING id并且只关心found特殊变量:
UPDATE users_addresses SET ... WHERE id = $1;
IF found THEN
RETURN 0;
END IF;
-- ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2563 次 |
| 最近记录: |