Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция не возвращает результат , а при выполнении запроса он есть / 13 сообщений из 13, страница 1 из 1
20.05.2015, 09:33
    #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
20.05.2015, 09:52
    #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
20.05.2015, 10:52
    #38963718
AndryDl44
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция не возвращает результат , а при выполнении запроса он есть
Спасибо конечно за ссылку. Но что то ничего напоминающего мой случай я не нашел. Там нет примера возврата таблицы. То что написал я так то же взял из доки по созданию функции возвращающей таблицу. return next и return query приводит к тому же результату , если бы все было так просто я бы не писал. Все это уже пробовалось и проверялось. Ни к чему не приводит попытка вернуть refcursor как в oracle , но там тупо ругается на составной тип и не компилится.

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

И если не трудно тыкнете пальцем в чем ошибка. Я хоть убей не вижу, сколько не перечитывай
...
Рейтинг: 0 / 0
20.05.2015, 11:02
    #38963736
AndryDl44
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция не возвращает результат , а при выполнении запроса он есть
То что я return воткнул выше exeption дело ни как не поправляет. После переноса в нужное место ни чего не изменилось.
...
Рейтинг: 0 / 0
20.05.2015, 11:07
    #38963747
AndryDl44
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция не возвращает результат , а при выполнении запроса он есть
Главное что текст ОШИБКА: в запросе нет назначения для данных результата , а данные есть и если запрос выполнять в не тела функции все хорошо.
...
Рейтинг: 0 / 0
20.05.2015, 11:13
    #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
20.05.2015, 13:57
    #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
20.05.2015, 14:05
    #38964119
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция не возвращает результат , а при выполнении запроса он есть
AndryDl44 ....
А Вам Maxim Boguk уважаемый если не чего подсказать, то не надо умничать и давать бесполезные ссылки.

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

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


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

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

END

P.S.
можно возвращать по одной записи RETURN NEXT select ... ; или комбинировать RETURN QUERY и RETURN NEXT
...
Рейтинг: 0 / 0
26.11.2015, 14:29
    #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
26.11.2015, 14:42
    #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
26.11.2015, 17:47
    #39114272
tortilka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция не возвращает результат , а при выполнении запроса он есть
qwwq, Спасибо! Да, теперь понятно как это работает, хотя не совсем понятно почему именно так. И наверно у многих кто перешел с других СУБД возникал этот вопрос. RAISE NOTICE действительно выручает, им и пользуюсь.
...
Рейтинг: 0 / 0
26.11.2015, 18:13
    #39114297
p2.
p2.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция не возвращает результат , а при выполнении запроса он есть
tortilka не совсем понятно почему именно такдля многих субд понятие "code block" отсутствует. Просто не пиши do $$, если не понятно, как оно работает.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция не возвращает результат , а при выполнении запроса он есть / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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