powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция не возвращает результат , а при выполнении запроса он есть
13 сообщений из 13, страница 1 из 1
Функция не возвращает результат , а при выполнении запроса он есть
    #38963571
AndryDl44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго всем времени суток. Первый раз столкнулся с проблемой, не знаю что делать. C postgres работаю не давно до этого в основном с oracle. Там было все ясно и просто, написал запрос, работает , значит работает функция. Здесь какое то шаманство, запрос рабочий. В дебагере выполняется, возвращает результаты. Запускаю из вне pgadmin например получаю:
ОШИБКА: в запросе нет назначения для данных результата
HINT: Если вам нужно отбросить результаты SELECT, используйте PERFORM.
CONTEXT: функция PL/pgSQL getcountpostforuadmin(character varying,integer), строка 3, оператор SQL-оператор

шаманство уже не знаю что делать и в какую сторону рыть.

текст функции

CREATE OR REPLACE FUNCTION sam.getcountpostforuadmin (
date_start varchar,
num_day integer
)
RETURNS TABLE (
useradmin_id bigint,
name varchar,
date_crt varchar,
cnt_post integer
) AS
$body$
BEGIN
select p.useradmin_id, u.name, date(p.date_create) as date_crt, count(p.useradmin_id) as cnt_post
from post p , useradmin u
where p.useradmin_id = u.id
and p.date_create between to_date(date_start,'dd.mm.yyyy')-num_day and to_date(date_start,'dd.mm.yyyy')
group by p.useradmin_id,u.name, date(p.date_create)
order by date(p.date_create);
RETURN ;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY DEFINER
COST 100 ROWS 1000;

Буду благодарен за любую помощь.
...
Рейтинг: 0 / 0
Функция не возвращает результат , а при выполнении запроса он есть
    #38963597
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndryDl44,

почитайте внимательно
http://www.postgresql.org/docs/9.4/interactive/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-RETURNING

у вас просто ошибка в синтаксисе Pl/pgsql.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Функция не возвращает результат , а при выполнении запроса он есть
    #38963718
AndryDl44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо конечно за ссылку. Но что то ничего напоминающего мой случай я не нашел. Там нет примера возврата таблицы. То что написал я так то же взял из доки по созданию функции возвращающей таблицу. return next и return query приводит к тому же результату , если бы все было так просто я бы не писал. Все это уже пробовалось и проверялось. Ни к чему не приводит попытка вернуть refcursor как в oracle , но там тупо ругается на составной тип и не компилится.

И вопрос тогда такого плана если ошибка в синтаксисе почему компилится ?

И если не трудно тыкнете пальцем в чем ошибка. Я хоть убей не вижу, сколько не перечитывай
...
Рейтинг: 0 / 0
Функция не возвращает результат , а при выполнении запроса он есть
    #38963736
AndryDl44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То что я return воткнул выше exeption дело ни как не поправляет. После переноса в нужное место ни чего не изменилось.
...
Рейтинг: 0 / 0
Функция не возвращает результат , а при выполнении запроса он есть
    #38963747
AndryDl44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Главное что текст ОШИБКА: в запросе нет назначения для данных результата , а данные есть и если запрос выполнять в не тела функции все хорошо.
...
Рейтинг: 0 / 0
Функция не возвращает результат , а при выполнении запроса он есть
    #38963758
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndryDl44Спасибо конечно за ссылку. Но что то ничего напоминающего мой случай я не нашел. Там нет примера возврата таблицы. То что написал я так то же взял из доки по созданию функции возвращающей таблицу. return next и return query приводит к тому же результату , если бы все было так просто я бы не писал. Все это уже пробовалось и проверялось. Ни к чему не приводит попытка вернуть refcursor как в oracle , но там тупо ругается на составной тип и не компилится.

И вопрос тогда такого плана если ошибка в синтаксисе почему компилится ?

И если не трудно тыкнете пальцем в чем ошибка. Я хоть убей не вижу, сколько не перечитывай

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
CREATE OR REPLACE FUNCTION sam.getcountpostforuadmin (
date_start varchar,
num_day integer
)
RETURNS TABLE (
useradmin_id bigint,
name varchar,
date_crt varchar,
cnt_post integer
) AS
$body$
BEGIN
RETURN QUERY select p.useradmin_id, u.name, date(p.date_create) as date_crt, count(p.useradmin_id) as cnt_post
from post p , useradmin u
where p.useradmin_id = u.id
and p.date_create between to_date(date_start,'dd.mm.yyyy')-num_day and to_date(date_start,'dd.mm.yyyy')
group by p.useradmin_id,u.name, date(p.date_create)
order by date(p.date_create);
END
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY DEFINER
COST 100 ROWS 1000;
...
Рейтинг: 0 / 0
Функция не возвращает результат , а при выполнении запроса он есть
    #38964106
AndryDl44
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Работает только так. Может кому пригодится. plpgsql -в топку, убираем его убираем begin end и вуаля запрос (функция возвращает значения).

CREATE OR REPLACE FUNCTION sam.getcountpostforuadmin (
date_start varchar,
num_day integer
)
RETURNS TABLE (
useradmin_id bigint,
name varchar,
date_crt date,
cnt_post bigint
) AS
$body$
select p.useradmin_id, u.name, date(p.date_create) as date_crt, count(p.useradmin_id) as cnt_post
from post p , useradmin u
where p.useradmin_id = u.id
and p.date_create between to_date(date_start,'dd.mm.yyyy')-num_day and to_date(date_start,'dd.mm.yyyy')
group by p.useradmin_id,u.name, date(p.date_create)
order by date(p.date_create);
$body$
LANGUAGE 'sql'
VOLATILE
CALLED ON NULL INPUT
SECURITY DEFINER
COST 100 ROWS 1000;

А Вам Maxim Boguk уважаемый если не чего подсказать, то не надо умничать и давать бесполезные ссылки.
...
Рейтинг: 0 / 0
Функция не возвращает результат , а при выполнении запроса он есть
    #38964119
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndryDl44 ....
А Вам Maxim Boguk уважаемый если не чего подсказать, то не надо умничать и давать бесполезные ссылки.

упс
вата в ассортименте
...
Рейтинг: 0 / 0
Функция не возвращает результат , а при выполнении запроса он есть
    #38980036
AlexH_0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndryDl44А Вам Maxim Boguk уважаемый если не чего подсказать, то не надо умничать и давать бесполезные ссылки.
Вам уже ответили правильным кодом. Выделяю ключевые слова (если лень залезать в документацию):

BEGIN
-- накопление выходного набора данных, можно выполнять несколько раз, результаты добавляются к выходному НД.
RETURN QUERY
select ... ;


-- продолжение тела функции
...

-- выход из функции и возврат накопленного НД (не обязательно, если выход совпадает с окончанием тела функции)
RETURN;

END

P.S.
можно возвращать по одной записи RETURN NEXT select ... ; или комбинировать RETURN QUERY и RETURN NEXT
...
Рейтинг: 0 / 0
Функция не возвращает результат , а при выполнении запроса он есть
    #39114057
tortilka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пожалуйста, а можно ли получить результаты select из блока выполняемого кода вне процедуры? Тут нельзя использовать RETURN
авторdo
$$
declare
p1 int;
p2 int;
p3 int;
begin

p3 = p1+ p2; --некоторые вычисления

select col2,col3, p3 from foo_table;

end;
$$
LANGUAGE 'plpgsql'

я понимаю что для кого-то большого смысла в этом нет. Но бывают к примеру задачи когда надо сделать UPDATE произведя некоторые вычисления ну и что бы быстро посмотреть правильность UPDATE можно поменять его на SELECT . Либо надо просто получить какие либо расчетные данные с помощью SELECT и.т.д. НУ вобщем можно ли как-то получить результаты SELECT из DO $$ BEGIN END;$$ ? Мне не лень обернуть все в процедуру, просто хочется понять что не так. Почему надо указывать назначение для данных запроса. Если из функции возвращается record через RETURN NEXT то там понятно что необходимо указать столбцы при вызове, потому что record может быть любой. а тут то все однозначно - SELECT со столбцами.
...
Рейтинг: 0 / 0
Функция не возвращает результат , а при выполнении запроса он есть
    #39114071
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tortilka,

RTFM, тащемта
http://www.postgresql.org/docs/current/static/sql-do.html The code block is treated as though it were the body of a function with no parameters, returning void. It is parsed and executed a single time.


хинт: нотификацию [RAISE NOTICE] никто не отменял.
...
Рейтинг: 0 / 0
Функция не возвращает результат , а при выполнении запроса он есть
    #39114272
tortilka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq, Спасибо! Да, теперь понятно как это работает, хотя не совсем понятно почему именно так. И наверно у многих кто перешел с других СУБД возникал этот вопрос. RAISE NOTICE действительно выручает, им и пользуюсь.
...
Рейтинг: 0 / 0
Функция не возвращает результат , а при выполнении запроса он есть
    #39114297
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tortilka не совсем понятно почему именно такдля многих субд понятие "code block" отсутствует. Просто не пиши do $$, если не понятно, как оно работает.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция не возвращает результат , а при выполнении запроса он есть
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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