powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / процедура со своим типом "cannot use RETURN NEXT in a non-SETOF..."
18 сообщений из 18, страница 1 из 1
процедура со своим типом "cannot use RETURN NEXT in a non-SETOF..."
    #33205695
JackS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
собственно сабж ...
пишу процедуру с EXECUTE что бы выполнить динамический SQL в зависимости от входного параметра ...

сам по себе SELECT работает, может что то с типом перемудрил, но с ним вроде тоже всё в порядке.....

Код: plaintext
FOR rec IN SELECT ....
на прямую без EXECUTE тоже не хочет с той же ошибкой

текст ошибки:
"cannot use RETURN NEXT in a non-SETOF function at or near NEXT at character 824"

a_professor_id - входной параметр.

тип:
Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE TYPE t_time_boards AS
   (time_board_id int4,
    professor_id int4,
    actual_hours numeric,
    name varchar,
    group_code varchar,
    course_planned_duration int4);

тело процедуры:
Код: 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.
26.
27.
28.
DECLARE
  rec t_time_boards;
  part_SQL varchar := " AND time_boards.professor_id = a_profesor_id";
  main_SQL varchar;

BEGIN
  main_SQL := "SELECT 
		   time_boards.time_board_id, time_boards.professor_id, 
		   time_boards.actual_hours, professors.name, student_groups.group_code, 
		   course_types.course_planned_duration
		FROM time_boards
		LEFT JOIN professors USING (professor_id)
		LEFT JOIN student_groups USING (group_id)
		LEFT JOIN course_types 
		     ON course_types.course_type_id = student_groups.group_course_type_id
		WHERE time_boards.session_id = get_current_session_id()";

	IF a_professor_id> 0  THEN
	  main_SQL := main_SQL||part_SQL;
	END IF;

	FOR rec IN EXECUTE main_SQL
		
	LOOP
		RETURN NEXT rec;
	END LOOP;

	RETURN;
END;
...
Рейтинг: 0 / 0
процедура со своим типом "cannot use RETURN NEXT in a non-SETOF..."
    #33205705
Meta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тело процедуры как раз не имеет никакого значения.
Тип возврата функции должен быть определен как
Код: plaintext
RETURNS SETOF t_time_boards
...
Рейтинг: 0 / 0
процедура со своим типом "cannot use RETURN NEXT in a non-SETOF..."
    #33205752
JackS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MetaТело процедуры как раз не имеет никакого значения.
Тип возврата функции должен быть определен как
Код: plaintext
RETURNS SETOF t_time_boards


да, спасибо :)

другой вопрос :\

что то при выполнении процедуры
Код: plaintext
select * from get_time_boards( 32 );
ему видимо не нравится длинный стринг SQL запроса или в чём дело?

если напрямую вписать SQL то всё начинает работать :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
NOTICE:  identifier
                  "SELECT 
		   time_boards.time_board_id, time_boards.professor_id, 
		   time_boards.actual_hours, professors.name, student_groups.group_code, 
		   course_types.course_planned_duration
		FROM time_boards
		LEFT JOIN professors USING (professor_id)
		LEFT JOIN student_groups USING (group_id)
		LEFT JOIN course_types 
		     ON course_types.course_type_id = student_groups.group_course_type_id
		WHERE time_boards.session_id = get_current_session_id()" 

will be truncated to "SELECT time_boards.time_board_id, time_boards.professor_"
и так далее с повторением запроса и не существованием такого поля таблицы как time_boards.professor_
...
Рейтинг: 0 / 0
процедура со своим типом "cannot use RETURN NEXT in a non-SETOF..."
    #33205754
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JackS wrote:
> ему видимо не нравится длинный стринг SQL запроса или в чём дело?
>
> NOTICE: identifier
> "SELECT
кавычки должны быть одинарные :)
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
процедура со своим типом "cannot use RETURN NEXT in a non-SETOF..."
    #33205772
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кроме того, что кавыки должны быть адинарны (ибо двойные -для айдентифайров), не понял, зачем через ... кхм... екзекьют? На случай пересоздания таблиц/ключей (каковые входят в откомпилированный запрос по ОИД).Или просто от желания сделать красивше? Вы ведь ничего изменяемого в строку не вставляете?
...
Рейтинг: 0 / 0
процедура со своим типом "cannot use RETURN NEXT in a non-SETOF..."
    #33205774
JackS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и опять спасибо :) но помогло отчасти ...

все двойные в стрингах закменил на одинарные ... при передаче 0 всё зломечательно но при передаче >0 теперь ругается на то что после канкатенации неизвестное поле a_professor_id ... то есть при EXECUTE он не подставляет значение передаваемой переменной ... :(
как с этим бороться ?

Код: plaintext
ERROR:  column "a_profesor_id" does not exist

P.S.: вот он последний рубеж, и будет мне счастье :)
...
Рейтинг: 0 / 0
процедура со своим типом "cannot use RETURN NEXT in a non-SETOF..."
    #33205778
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кхых, разглядел таки апендикс, но
part_SQL varchar := " AND time_boards.professor_id = "|| a_profesor_id;
...
Рейтинг: 0 / 0
процедура со своим типом "cannot use RETURN NEXT in a non-SETOF..."
    #33205788
JackS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321кроме того, что кавыки должны быть адинарны (ибо двойные -для айдентифайров), не понял, зачем через ... кхм... екзекьют? На случай пересоздания таблиц/ключей (каковые входят в откомпилированный запрос по ОИД).Или просто от желания сделать красивше? Вы ведь ничего изменяемого в строку не вставляете?

а EXECUTE для того что я формирую запрос в зависимости от передаваемого в функцию параметра .... если есть вариант как сделать без EXECUTE, то только спасибо скажу ... :)

за одно как сделать, если возможно, что бы если я ничего не передаю в функцию при её вызове select * from get_time_boards(32); то переменной автоматом присваивался "0", что то а-ля
Код: plaintext
function ($var= 0 )
...
Рейтинг: 0 / 0
процедура со своим типом "cannot use RETURN NEXT in a non-SETOF..."
    #33205802
JackS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321кхых, разглядел таки апендикс, но
part_SQL varchar := " AND time_boards.professor_id = "|| a_profesor_id;

а не помогает :( пробовал ... и с " " и с ' ' .... и при декларации и внутри IF :(
...
Рейтинг: 0 / 0
процедура со своим типом "cannot use RETURN NEXT in a non-SETOF..."
    #33205815
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
BEGIN
	FOR rec IN 
		SELECT 
		   time_boards.time_board_id, time_boards.professor_id, 
		   time_boards.actual_hours, professors.name,
		student_groups.group_code, 
		   course_types.course_planned_duration
		FROM time_boards
		LEFT JOIN professors USING (professor_id)
		LEFT JOIN student_groups USING (group_id)
		LEFT JOIN course_types 
		     ON course_types.course_type_id = 
			student_groups.group_course_type_id
		WHERE time_boards.session_id = get_current_session_id()
		AND (a_professor_id= 0  OR 
		(a_professor_id=time_boards.professor_id ))
		
	LOOP
		RETURN NEXT rec;
	END LOOP;

	RETURN;
END;
как-то так (хранимки позволяют использовать в SQL параметры по именам.

ЗЗЫ Динамо типа Екзекьют нужно для передачи в СКЛ _вычислимых_ _идентификаторов_, или даже служебных слов самого СКЛ. Или на случай возможности многократного срубания праймари кеев (специфические задачи с массовой заливкой/дропаньем данных).
...
Рейтинг: 0 / 0
процедура со своим типом "cannot use RETURN NEXT in a non-SETOF..."
    #33205817
JackS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
помогает ... просто я так и скопировал profesor с одним "с" :)

остался вопрос возможно ли сделать так что бы при вызове с пустым параметром присваивался ноль или что то вроде этого ...

есть идея создать процедуру с тем же именем но без параметра в которой будет вызываться SELECT * FROM get_time_boards(0);
:) ?

но может есть что то получше ? :)
...
Рейтинг: 0 / 0
процедура со своим типом "cannot use RETURN NEXT in a non-SETOF..."
    #33205821
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JackS 4321кхых, разглядел таки апендикс, но
part_SQL varchar := " AND time_boards.professor_id = "|| a_profesor_id;

а не помогает :( пробовал ... и с " " и с ' ' .... и при декларации и внутри IF :(
a_profesor_id - это имя параметра из описания ф-ии? (как я думал) Или фихзнаитшто?. Тогда попробуйте
part_SQL := " AND time_boards.professor_id = "|| $1::varchar;
кстати, что будет, если
a_profesor_id IS Null
?
...
Рейтинг: 0 / 0
процедура со своим типом "cannot use RETURN NEXT in a non-SETOF..."
    #33205823
JackS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321
Код: plaintext
1.
2.
		AND (a_professor_id= 0  OR 
		(a_professor_id=time_boards.professor_id ))
как-то так (хранимки позволяют использовать в SQL параметры по именам.

ЗЗЫ Динамо типа Екзекьют нужно для передачи в СКЛ _вычислимых_ _идентификаторов_, или даже служебных слов самого СКЛ. Или на случай возможности многократного срубания праймари кеев (специфические задачи с массовой заливкой/дропаньем данных).

а разве в Вашем варианте он не будет ругаться что я вызываю процедуру без параметра ?
...
Рейтинг: 0 / 0
процедура со своим типом "cannot use RETURN NEXT in a non-SETOF..."
    #33205825
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(a_professor_id=0) OR (a_professor_id=0 IS NULL)
...
Рейтинг: 0 / 0
процедура со своим типом "cannot use RETURN NEXT in a non-SETOF..."
    #33205831
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JackS а разве в Вашем варианте он не будет ругаться что я вызываю процедуру без параметра ? а не пойти бы вам покурить доку?


ЗЗЫ на каждый ТИП вызова (т.е. набор и тип (если не кастятся автокастом) параметров) надо создать ОТДЕЛЬНУЮ одноименную ф-ю - так типа риализуецца "перекрытие оперделения"
...
Рейтинг: 0 / 0
процедура со своим типом "cannot use RETURN NEXT in a non-SETOF..."
    #33205832
JackS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321 JackS 4321кхых, разглядел таки апендикс, но
part_SQL varchar := " AND time_boards.professor_id = "|| a_profesor_id;

а не помогает :( пробовал ... и с " " и с ' ' .... и при декларации и внутри IF :(
a_profesor_id - это имя параметра из описания ф-ии? (как я думал) Или фихзнаитшто?. Тогда попробуйте
part_SQL := " AND time_boards.professor_id = "|| $1::varchar;
кстати, что будет, если
a_profesor_id IS Null
?

аха .. это я просто обшибся :)

а при select * from get_time_boards(NULL); будут записи для всех преподов ... всё равно что select * from get_time_boards(0);
...
Рейтинг: 0 / 0
процедура со своим типом "cannot use RETURN NEXT in a non-SETOF..."
    #33205835
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321(a_professor_id=0) OR (a_professor_id IS NULL)очипятка
...
Рейтинг: 0 / 0
процедура со своим типом "cannot use RETURN NEXT in a non-SETOF..."
    #33206104
JackS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321 4321(a_professor_id=0) OR (a_professor_id IS NULL)очипятка
не совсем понятно в честь чего это, ну да ладно сделал по своему варианту ... :)

всем спасибо за помощь :)
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / процедура со своим типом "cannot use RETURN NEXT in a non-SETOF..."
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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