PostgreSQL - ошибка: состояние SQL: XX000 - PullRequest
2 голосов
/ 15 марта 2010

У меня есть таблица в 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

Вызов функции выбора возвращает все строки в таблице, как и ожидалось.

Мне нужно добавить пару столбцов в таблицу (оба из которых являются внешними ключами для других таблиц в базе данных). Это дает мне новую таблицу 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

Что вызывает эту ошибку и как ее исправить? Я пытался удалить и воссоздать столбцы и функцию - но возникает та же ошибка.

Платформа - это PostgreSQL 8.4, работающая на Windows Server. Спасибо.

Ответы [ 3 ]

4 голосов
/ 15 марта 2010

Вы сбросили и воссоздали функцию? Кстати, ты должен любить, насколько удобен Postgres. Какую другую базу данных вы бы обняли и поцеловали (XXOOO) как состояние ошибки?

1 голос
/ 15 марта 2010

Когда я видел нечто подобное в прошлом, это было потому, что соединение с базой данных кэшировало определенные атрибуты функции.Поэтому, если я использовал pgAdmin, мне пришлось закрыть окно редактора SQL и установить новое соединение, чтобы заставить функцию работать правильно.Если вы этого еще не сделали, убедитесь, что вы тестируете функцию на новых соединениях с БД.

Я думал, что проблема была исправлена ​​несколько версий назад в PostgreSQL, но попробовать стоит.

0 голосов
/ 01 февраля 2013

Нашел более легкое для меня решение: создал резервную копию базы данных и восстановил ее из этой резервной копии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...