我无法消除歧义此特定postgres函数的麻烦,该函数插入目标表的FROM语句并返回新创建的唯一ID:
CREATE OR REPLACE FUNCTION "copyEntry"(OUT "entryId" INTEGER, IN "copyEntryId" INTEGER) RETURNING VOID AS $$
BEGIN
INSERT INTO "entries" ("data") SELECT "data" FROM "entries" WHERE "entryId" = "copyEntryId" RETURNING "entryId" INTO "entryId";
--Other plpgsql code below
END;
$$ LANGUAGE 'plpgsql';
"entryId" INTO "entryId"
含糊不清,我似乎无法找到一种方法来对插入表进行别名以消除歧义。我想将输出参数保持为" entryId"
答案 0 :(得分:1)
将参数命名为函数,以便将它们与表中的列区分开来。这是一个很好的编程实践。
这样的事情:
CREATE OR REPLACE FUNCTION "copyEntry"(OUT "out_entryId" INTEGER, IN "in_copyEntryId" ) RETURNING VOID AS $$
BEGIN
INSERT INTO "entries"
SELECT "data"
FROM "entries" e
WHERE "entryId" = "in_copyentryid"
RETURNING "entryId" ;
--Other plpgsql code below
END;
RETURNING
子句应返回正在插入的行的值 - 这可能是某种默认值或自动递增的值。正如documentation描述的那样:
可选的RETURNING子句导致INSERT计算并返回 基于实际插入的每一行的值。这主要是有用的 用于获取默认提供的值,例如序列号 序列号。但是,使用表的列的任何表达式都是 允许。 RETURNING列表的语法与 SELECT的输出列表。
代码问题可能是参数与函数同名的问题。
答案 1 :(得分:1)
变量和列之间存在歧义。有两种消除变量名称的方法:根据表和代码块名称为它们添加前缀,或者将它们重命名为唯一。
在这种情况下,参数在函数的最外层代码块中声明,该函数以函数命名。因此"entryId"
参数可以引用为"copyEntry"."entryId"
。同时,该列来自表entries
,因此可以引用为entries."entryId"
。
然而,为变量命名可能更具可读性,因此它们首先可能没有歧义,可能使用前缀约定,因此您的参数将为"out_entryId"
。