PostgreSQL - 错误:SQL状态:XX000

时间:2010-03-15 11:57:43

标签: sql postgresql

我在Postgres有一张表如下:

CREATE TABLE "Population"
(
  "Id" bigint NOT NULL DEFAULT nextval('"population_Id_seq"'::regclass),
  "Name" character varying(255) NOT NULL,
  "Description" character varying(1024),
  "IsVisible" boolean NOT NULL
  CONSTRAINT "pk_Population" PRIMARY KEY ("Id")
)
WITH (
  OIDS=FALSE
);

一个看起来像这样的选择函数:

CREATE OR REPLACE FUNCTION "Population_SelectAll"()
  RETURNS SETOF "Population" AS
$BODY$select
  "Id",
  "Name",
  "Description",
  "IsVisible"
from "Population";
$BODY$
  LANGUAGE 'sql' STABLE
  COST 100

调用select函数会按预期返回表中的所有行。

我需要在表中添加几列(这两列都是数据库中其他表的外键)。这给了我一个新的表格def如下:

CREATE TABLE "Population"
(
  "Id" bigint NOT NULL DEFAULT nextval('"population_Id_seq"'::regclass),
  "Name" character varying(255) NOT NULL,
  "Description" character varying(1024),
  "IsVisible" boolean NOT NULL,
  "DefaultSpeciesId" bigint NOT NULL,
  "DefaultEcotypeId" bigint NOT NULL,
  CONSTRAINT "pk_Population" PRIMARY KEY ("Id"),
  CONSTRAINT "fk_Population_DefaultEcotypeId" FOREIGN KEY ("DefaultEcotypeId")
      REFERENCES "Ecotype" ("Id") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT "fk_Population_DefaultSpeciesId" FOREIGN KEY ("DefaultSpeciesId")
      REFERENCES "Species" ("Id") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE
);

和功能:

CREATE OR REPLACE FUNCTION "Population_SelectAll"()
  RETURNS SETOF "Population" AS
$BODY$select
  "Id",
  "Name",
  "Description",
  "IsVisible",
  "DefaultSpeciesId",
  "DefaultEcotypeId"
from "Population";
$BODY$
  LANGUAGE 'sql' STABLE
  COST 100
  ROWS 1000;

在这些更改后调用该函数会导致以下错误消息:

ERROR: could not find attribute 11 in subquery targetlist
SQL state: XX000

导致此错误的原因是什么?如何解决?我试图删除并重新创建列和函数 - 但同样的错误发生。

Platform是在Windows Server上运行的PostgreSQL 8.4。感谢。

3 个答案:

答案 0 :(得分:4)

你丢弃并重新创建了这个功能吗? 顺便说一下,你必须喜欢Postgres的用户友好性。您将拥抱和亲吻(XXOOO)作为错误状态的其他数据库是什么?

答案 1 :(得分:1)

当我在过去看过类似的东西时,那是因为数据库连接缓存了某些功能属性。因此,如果我使用pgAdmin,我必须关闭SQL编辑器窗口并建立新连接才能使函数正常工作。如果您还没有,请确保在新数据库连接上测试该功能。

我认为这个问题在PostgreSQL中已经修复了几个版本,但是值得一试。

答案 2 :(得分:0)

我发现解决方案更容易:创建数据库的备份并从此备份中恢复它。