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

ERROR: syntax error at or near "$1" at character 148
CONTEXT: PL/pgSQL function "get_graph_data" line 13 at for over select rows

В операторе:
select * from get_graph_data(false)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE FUNCTION get_graph_data(boolean) RETURNS SETOF cake.user_graph AS '
declare
do_delete alias for $1;
now_day timestamp;
csess cake.session;
ugraph cake.user_graph;
begin
 -- текуйщий день
 now_day = CURRENT_DATE;

 --закрытые сессии
 select into csess * from session where s_end is not null;
 
 for ugraph in SELECT u.login,extract(epoch from k.kdatetime,k.diff_in,k.diff_out FROM keepalive k, users u, session s WHERE k.id_session in csess.id and s.id_user=u.id and k.kdatetime<now_day order by u.login,k.kdatetime 
loop
 return next ugraph;
end loop;
return ugraph;
end
'
LANGUAGE plpgsql;

Код: plaintext
1.
2.
3.
4.
5.
CREATE TYPE user_graph AS (
        login character( 20 ),
        datetime double precision,
        diff_in bigint,
        diff_out bigint 
);

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE keepalive (
    id serial NOT NULL,
    id_session integer NOT NULL,
    kdatetime timestamp without time zone DEFAULT ('now'::text)::timestamp( 6 ) with time zone NOT NULL,
    volumein bigint DEFAULT  0  NOT NULL,
    volumeout bigint DEFAULT  0  NOT NULL,
    diff_in bigint DEFAULT  0 ,
    diff_out bigint DEFAULT  0 
) WITHOUT OIDS;

Подскажите что не так.
...
Рейтинг: 0 / 0
не могу заполнить свой тип
    #33266032
фффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тип возможно не при чём. Это точный текст функции?
Код: plaintext
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 FUNCTION get_graph_data(boolean) RETURNS SETOF cake.user_graph AS '
declare
do_delete alias for $1;
now_day timestamp;
csess cake.session;
ugraph cake.user_graph;
begin
 -- текуйщий день
 now_day = CURRENT_DATE;

 --закрытые сессии
 select into csess * from session where s_end is not null;
 
 for ugraph in 
SELECT u.login,extract(epoch from k.kdatetime),k.diff_in,k.diff_out --!!! пропущена )скобка
FROM keepalive k, users u, session s 
WHERE k.id_session = csess.id and s.id_user=u.id and k.kdatetime<now_day order by u.login,k.kdatetime --!!!  вместо in csess.id поставить = csess.id

loop
 return next ugraph;
end loop;
return ugraph; --!!! должен быть просто return;
end
'
LANGUAGE plpgsql;
Версия PG 7.x? Наверное стоит установить на девелоперской машине 8.0 просто для изучения - там сообщения об ошибках внутри pl/pgsql значительно информативнее, и вылетают ещё при создании функции.
...
Рейтинг: 0 / 0
не могу заполнить свой тип
    #33267424
кхм
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ошибка скорее всего тут:
WHERE .... k.id_session in csess.id
думаецца, вы зря надеетесь, что csess это набор. Это попросту запись. Одна запись. Тч что или
WHERE .... k.id_session = csess.id
(если запись заведомо одна)
или
WHERE .... k.id_session IN(SELECT id FROM session where s_end is not null) ...
если их много
...
Рейтинг: 0 / 0
не могу заполнить свой тип
    #33267467
Spider84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ошибка SQL:


ERROR: return type mismatch in function returning tuple at or near ";"
CONTEXT: compile of PL/pgSQL function "get_graph_data" near line 17

В операторе:
select * from get_graph_data(false)

эта ошибка после первых поправок, она же после вторых
...
Рейтинг: 0 / 0
не могу заполнить свой тип
    #33267572
см предыдцщего оратора автор
Код: plaintext
return ugraph; --!!! должен быть просто return;
- это как раз 17-я строка
...
Рейтинг: 0 / 0
не могу заполнить свой тип
    #33267669
Spider84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну я и сделал просто return; и получил это.
...
Рейтинг: 0 / 0
не могу заполнить свой тип
    #33301421
Spider84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А ведь я так и не решил проблемы. А жаль.
...
Рейтинг: 0 / 0
не могу заполнить свой тип
    #33301442
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты как написал? return; return next или return next ugraph? Надо писать return next; (без всяких ugraph);
...
Рейтинг: 0 / 0
не могу заполнить свой тип
    #33302285
Spider84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
declare
do_delete alias for $1;
now_day timestamp;
csess cake.session;
ugraph cake.user_graph;
begin
-- текуйщий день
now_day = CURRENT_DATE;

--закрытые сессии
select into csess * from session where s_end is not null;

for ugraph in SELECT u.login,extract(epoch from k.kdatetime),k.diff_in,k.diff_out FROM keepalive k, users u, session s WHERE k.id_session in (select id from session where s_end is not null) and s.id_user=u.id and k.kdatetime<now_day order by u.login,k.kdatetime
loop
return next ugraph;
end loop;
return;
end

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


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