使用INSERT INTO“table”FROM“table”消除歧义功能RETURNING“id”=“id”

时间:2015-02-23 15:56:16

标签: sql postgresql function

我无法消除歧义此特定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"

2 个答案:

答案 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"