我正在尝试从使用 WITH 的 plpgsql MERGE 相关操作中返回一个整数。我要返回的值在下面的 WITH 语句中 - id。我使用以下代码收到的错误如下:
关系“post_insert”不存在”
解释代码:此代码可能不是执行以下操作的最有效方法,但我正在设置一些东西以用于我认为我将需要使用 MERGE 的其他功能的某些未来用例。所有这一切都是通过 Post_Insert 创建一个帖子,然后使用该 Post_Insert(它返回帖子的 ID),我在 Hashtags_Posts 表中创建与主标签表相关的行。
“RETURN(SELECT id FROM Post_Insert)”是导致问题的原因。我似乎无法从 Post_Insert 获取 id 并将其返回。
非常感谢有关如何访问 Post_Insert 中的 id 的任何帮助。
create or replace function createPost(
uid_query text,
post_text_query text default '',
text_url_query text default '',
photo_url_query text default '',
video_url_query text default '',
audio_url_query text default '',
location_query text default '',
tags_array_query text[] default '{general}',
photo_query boolean default false
)
returns integer language plpgsql as $$
BEGIN
WITH
Post_Insert AS (
INSERT INTO "Posts" (
author,
post_text,
text_url,
photo_url,
video_url,
audio_url,
location,
photo
)
VALUES (
uid_query,
post_text_query,
text_url_query,
photo_url_query,
video_url_query,
audio_url_query,
location_query,
photo_query
)
RETURNING id
)
MERGE INTO "Hashtags_Posts" HP
USING (SELECT *
FROM "Hashtags" H
WHERE H.hashtag = ANY(tags_array_query))
as TMT
ON HP.id = (SELECT id FROM Post_Insert) AND TMT.id = HP.hashtag_id
WHEN NOT MATCHED
THEN INSERT (post_id, hashtag_id)
VALUES ((SELECT id FROM Post_Insert), TMT.id);
RETURN (SELECT id FROM Post_Insert);
END
$$
我看不出有任何理由
INSERT
必须MERGE
在同一声明中。(在任何情况下,整个函数都在同一个事务中运行。)只需将它们分开,并将结果保存id
在 PL/pgSQL 变量中,就像此处手册中的说明一样。或者,更好的是,使用
OUT
参数而不是变量来简化事情:我的长期建议是在 Postgres 中使用合法的小写标识符,不能被(丢失的)双引号搞乱。看: