powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция, возвращающая одну запись таблицы
8 сообщений из 8, страница 1 из 1
Функция, возвращающая одну запись таблицы
    #38862274
Elfix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно решить учебную задачу.
Есть схема "Справочники". В ней таблица "Страны".
Таблица имеет поля:

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

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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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;


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


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

Помогите решить проблему.
Заранее благодарю.
...
Рейтинг: 0 / 0
Функция, возвращающая одну запись таблицы
    #38862294
.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.
Гость
ElfixПомогите решить проблему.


Стена - там.

Пробуйте

Код: sql
1.
SELECT "Наименование" FROM "Справочники"."ПолучитьСтрану"('Россия') AS ("Наименование" TEXT);
...
Рейтинг: 0 / 0
Функция, возвращающая одну запись таблицы
    #38862353
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-оператор
...
Рейтинг: 0 / 0
Функция, возвращающая одну запись таблицы
    #38862484
Ы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ы
Гость
Elfix,

1) Если наименование уникально (т.е. на него наложено соответствующее ограничение), то LIMIT 1 вам не нужен.
2) Перепишите функцию на RETURNS TABLE, и будет вам счастье.
...
Рейтинг: 0 / 0
Функция, возвращающая одну запись таблицы
    #38862556
.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.
Гость
Elfix,

SELECT "Наименование" FROM "Справочники"."ПолучитьСтрану"('Россия') AS ("Код" INTEGER, "Наименование" TEXT);
...
Рейтинг: 0 / 0
Функция, возвращающая одну запись таблицы
    #38862724
какбе
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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-операторвторое "наименование" (в "неоднозначности"), сюрпрайс -- это аргумент функции. т.ч. специфицируйте принадлежность


кактотак

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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;
...
Рейтинг: 0 / 0
Функция, возвращающая одну запись таблицы
    #38862726
какбе
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
какбекактотак

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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;


-- поправил
...
Рейтинг: 0 / 0
Функция, возвращающая одну запись таблицы
    #38862761
Elfix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо!
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция, возвращающая одну запись таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]