Функция, возвращающая одну запись таблицы

Elfix
Дата: 24.01.2015 12:58:12
Нужно решить учебную задачу.
Есть схема "Справочники". В ней таблица "Страны".
Таблица имеет поля:

"Код" serial;
"Наименование" character varying(150).

"Наименование" уникально и повторяться не может.
Хочу сделать функцию, которая бы возвращала одну запись этой таблицы, по переданному наименованию.

CREATE OR REPLACE FUNCTION "Справочники"."ПолучитьСтрану"("Наименование" character varying)
RETURNS record AS
$BODY$
DECLARE
Result record;
BEGIN
SET SEARCH_PATH TO "Справочники";
SELECT * INTO Result FROM "Страны" WHERE "Наименование" = $1 LIMIT 1 OFFSET 0;
RETURN Result;

END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION "Справочники"."ПолучитьСтрану"(character varying)
OWNER TO postgres;

Функция создается без проблем. Однако при ее использовании возникает ошибка:
SELECT "Наименование" FROM "Справочники"."ПолучитьСтрану"('Россия');

ОШИБКА: у функций, возвращающих запись, должен быть список с определением колонок
LINE 18: SELECT "Наименование" FROM "Справочники"."ПолучитьСтрану"('Р...

Помогите решить проблему.
Заранее благодарю.
.
Дата: 24.01.2015 14:36:20
+
Elfix
Помогите решить проблему.


Стена - там.


Пробуйте

SELECT "Наименование" FROM "Справочники"."ПолучитьСтрану"('Россия') AS ("Наименование" TEXT);
Elfix
Дата: 24.01.2015 17:47:01
Спасибо.

Но все равно не работает. Сообщение:

ОШИБКА: неоднозначная ссылка на колонку "Наименование"
LINE 1: SELECT * FROM "Страны" WHERE "Наименование" = $1...
^
DETAIL: Подразумевается ссылка на переменную PL/pgSQL или колонку таблицы.
QUERY: SELECT * FROM "Страны" WHERE "Наименование" = $1 LIMIT 1 OFFSET 0
CONTEXT: функция PL/pgSQL "Справочники"."ПолучитьСтрану"(character varying), строка 6, оператор SQL-оператор

********** Ошибка **********

ОШИБКА: неоднозначная ссылка на колонку "Наименование"
SQL-состояние: 42702
Подробности: Подразумевается ссылка на переменную PL/pgSQL или колонку таблицы.
Контекст: функция PL/pgSQL "Справочники"."ПолучитьСтрану"(character varying), строка 6, оператор SQL-оператор
Ы
Дата: 25.01.2015 01:42:26
Elfix,

1) Если наименование уникально (т.е. на него наложено соответствующее ограничение), то LIMIT 1 вам не нужен.
2) Перепишите функцию на RETURNS TABLE, и будет вам счастье.
.
Дата: 25.01.2015 11:07:30
Elfix,

SELECT "Наименование" FROM "Справочники"."ПолучитьСтрану"('Россия') AS ("Код" INTEGER, "Наименование" TEXT);
какбе
Дата: 25.01.2015 21:13:21
Elfix
Спасибо.

Но все равно не работает. Сообщение:

ОШИБКА: неоднозначная ссылка на колонку "Наименование"
LINE 1: SELECT * FROM "Страны" WHERE "Наименование" = $1...
^
DETAIL: Подразумевается ссылка на переменную PL/pgSQL или колонку таблицы.
QUERY: SELECT * FROM "Страны" WHERE "Наименование" = $1 LIMIT 1 OFFSET 0
CONTEXT: функция PL/pgSQL "Справочники"."ПолучитьСтрану"(character varying), строка 6, оператор SQL-оператор

********** Ошибка **********

ОШИБКА: неоднозначная ссылка на колонку "Наименование"
SQL-состояние: 42702
Подробности: Подразумевается ссылка на переменную PL/pgSQL или колонку таблицы.
Контекст: функция PL/pgSQL "Справочники"."ПолучитьСтрану"(character varying), строка 6, оператор SQL-оператор
второе "наименование" (в "неоднозначности"), сюрпрайс -- это аргумент функции. т.ч. специфицируйте принадлежность


кактотак

CREATE OR REPLACE FUNCTION "Справочники"."ПолучитьСтрану"("Наименование" character varying)
RETURNS --record -- у вас тип есть на руках, на кой вам мучаться с описанием возврата в момент вызова
  "Справочники"."Страны"
AS
$BODY$
DECLARE
Result record;
BEGIN
--SET SEARCH_PATH TO "Справочники"; -- накуй с такими заявками, в дворники
-- есть в крайнем случае ALTER FUNCTION  ... Set, но тоже поубивал бы
SELECT * INTO Result FROM "Справочники"."Страны" s WHERE s."Наименование" = $1 LIMIT 1 OFFSET 0;
RETURN Result;

END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
какбе
Дата: 25.01.2015 21:17:09
какбе
кактотак

CREATE OR REPLACE FUNCTION "Справочники"."ПолучитьСтрану"("Наименование" character varying)
RETURNS Справочники"."Страны"
AS
$BODY$
SELECT * FROM "Справочники"."Страны" s WHERE s."Наименование" = $1 LIMIT 1 OFFSET 0;
$BODY$
LANGUAGE sql VOLATILE
COST 100;

-- поправил
Elfix
Дата: 25.01.2015 23:03:10
Большое спасибо!