Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / функцыя, в чем ошибка непойму... / 2 сообщений из 2, страница 1 из 1
12.02.2016, 15:48
    #39169670
MMM_Corp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функцыя, в чем ошибка непойму...
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
CREATE OR REPLACE FUNCTION public.abc (
  in "cat_id" INTEGER = 0,   in "date1" DATE = NULL,   in "date2" DATE = NULL
)
RETURNS TABLE (num bigint, items_id integer, sname varchar, fprice FLOAT,
 dola FLOAT, suma_dola float, rank char(1)) AS
$body$
DECLARE
  i int;
BEGIN
select set_config('custom.prev', '0', false);

return query select 
h.num, h.items_id, h.sname, h.fprice, h.dola, h.suma_dola,
    case
        when h.suma_dola < 0.5 then 'A'
        when h.suma_dola between 0.5 and 0.85 then 'B'
    	else 'C'
    end ::char(1) rank
from 


(

select
	f.num num,
	f.items_id,
	f.sname,
	f.fprice,
	f.dola,
	f.dola+current_setting('custom.prev')::FLOAT as suma_dola,
	set_config('custom.prev', cast(f.dola+current_setting('custom.prev')::FLOAT as text), false)
from
	(
    -- id товара, название, общая выручка, Доля накопительного итога
    select
    	row_number() over() num,
        t.items_id,
        t.sname,
        t.fprice,
        t.fprice/ sum(t.fprice) over () dola
    	from
        (
        -- id товара, название, сумма, (за указанный период + категорию)
        select
            s.items_id,
            i.sname,
            sum(s.price * s.icount) fprice
            -- c.sname
        from
            sales as s,
            items as i,
            cats as c
         where i.id = s.items_id
            and i.cat_id = c.id
           /* 
           and  i.cat_id = 59
           and s.ddate BETWEEN '01.01.2016' and '01.04.2016'
           */
        group by s.items_id, i.sname
        order by 3 desc) as t
    ) as f
) as h;



END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER;



в не тела функции выполняется нормально, без всяких проблем, а вот в функции почемуто нет

Код: plsql
1.
select * from abc(7, '01.01.2015', '01.01.2016');



ОШИБКА: в запросе нет назначения для данных результата
HINT: Если вам нужно отбросить результаты SELECT, используйте PERFORM.
CONTEXT: функция PL/pgSQL abc(integer,date,date), строка 5, оператор SQL-оператор

что за ерунда... вы уж извините если вопрос глупый, с Postgree крайне редко работаю, но застрял на глупом месте казалось бы...
...
Рейтинг: 0 / 0
12.02.2016, 15:51
    #39169673
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функцыя, в чем ошибка непойму...
MMM_Corp
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
CREATE OR REPLACE FUNCTION public.abc (
  in "cat_id" INTEGER = 0,   in "date1" DATE = NULL,   in "date2" DATE = NULL
)
RETURNS TABLE (num bigint, items_id integer, sname varchar, fprice FLOAT,
 dola FLOAT, suma_dola float, rank char(1)) AS
$body$
DECLARE
  i int;
BEGIN
select set_config('custom.prev', '0', false);

return query select 
h.num, h.items_id, h.sname, h.fprice, h.dola, h.suma_dola,
    case
        when h.suma_dola < 0.5 then 'A'
        when h.suma_dola between 0.5 and 0.85 then 'B'
    	else 'C'
    end ::char(1) rank
from 


(

select
	f.num num,
	f.items_id,
	f.sname,
	f.fprice,
	f.dola,
	f.dola+current_setting('custom.prev')::FLOAT as suma_dola,
	set_config('custom.prev', cast(f.dola+current_setting('custom.prev')::FLOAT as text), false)
from
	(
    -- id товара, название, общая выручка, Доля накопительного итога
    select
    	row_number() over() num,
        t.items_id,
        t.sname,
        t.fprice,
        t.fprice/ sum(t.fprice) over () dola
    	from
        (
        -- id товара, название, сумма, (за указанный период + категорию)
        select
            s.items_id,
            i.sname,
            sum(s.price * s.icount) fprice
            -- c.sname
        from
            sales as s,
            items as i,
            cats as c
         where i.id = s.items_id
            and i.cat_id = c.id
           /* 
           and  i.cat_id = 59
           and s.ddate BETWEEN '01.01.2016' and '01.04.2016'
           */
        group by s.items_id, i.sname
        order by 3 desc) as t
    ) as f
) as h;



END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER;



в не тела функции выполняется нормально, без всяких проблем, а вот в функции почемуто нет

Код: plsql
1.
select * from abc(7, '01.01.2015', '01.01.2016');



ОШИБКА: в запросе нет назначения для данных результата
HINT: Если вам нужно отбросить результаты SELECT, используйте >>>PERFORM<<<.
CONTEXT: функция PL/pgSQL abc(integer,date,date), строка 5, оператор SQL-оператор

что за ерунда... вы уж извините если вопрос глупый, с Postgree крайне редко работаю, но застрял на глупом месте казалось бы...
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / функцыя, в чем ошибка непойму... / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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