Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / составление и возврат множества композитного типа / 3 сообщений из 3, страница 1 из 1
11.08.2005, 14:21
    #33210534
JackS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
составление и возврат множества композитного типа
и так ... попробую объяснить что нужно ... а то мануал по таким вопросам бесполезен а за одно посмотрите что и где я не так написал в процедуре :\ потому как пишет просто еррор без объяснений и не хочет сохранять :(

что есть:
1) есть процедура возвращающая список студентов по group_id
Код: plaintext
get_group_students(a_group_id)
2) есть процедура возвращающая флаг "0", "1", "-1" по student_id и ещё двум параметрам
Код: plaintext
check_student_for_certificate(student_id, a_max_absences, a_min_note)
3) есть композитный тип:
Код: plaintext
1.
2.
CREATE TYPE t_certified_students AS
   (student_id int4,
    certified int4);

моя процедура: (a_group_id, a_max_absences, a_min_note передаются в неё параметрами)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
DECLARE
  rec RECORD;
  return_rec t_certified_students;
  flag int4;
BEGIN
  FOR rec IN SELECT * FROM get_group_students(a_group_id) LOOP
     SELECT INTO flag * FROM check_student_for_certificate(rec.student_id, a_max_absences, a_min_note);
     return_rec := ROW(rec.student_id, flag);
     RETURN return_rec;
  END LOOP;
RETURN;
END;

что нужно
мне нужно что бы процедура написанная выше работала следующим образом:
1) получает 3 параметра a_group_id, a_max_absences, a_min_note
2) пробегается в цикле по записям возвращаемым get_group_students и берёт оттуда ID студента для вставки в процедуру check_student_for_certificate
3) из процедуры check_student_for_certificate - получаем флаг 0/1/-1 для этого студента
4) процедура представленная выше при обращении к ней (25 - ID группы, 10 - максимальное количество пропусков, 5 - результат теста/экзамена)
SELECT * FROM check_all_in_group_for_certificate (25,10,5);

должна вернуть список в любом виде или а-ля
array(student_id => certificate_flag)
на пример для большей понятности
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
array(
         33  =>  0 ,
         34  =>  1 ,
         35  =>  1 ,
         36  =>  0 ,
         37  =>  1 ,
         38  =>  0 
)

или как обычно возвращает многомерный массив с нумерацией записей

Код: plaintext
1.
2.
3.
4.
array(
          1  => array(student_id => certificate_flag),
          2  => array(student_id2 => certificate_flag),
          3  => array(student_id3 => certificate_flag)
)

то есть список композитного типа сформированный внутри процедуры по результатам других процедур :)

всё равно в каком виде лишь бы там были студенты из группы и флаг выдавать ему сертификат или нет :)

надеюсь идея понятна ... расписал как мог :\
...
Рейтинг: 0 / 0
11.08.2005, 14:31
    #33210557
JackS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
составление и возврат множества композитного типа
сразу скажу что такая конструкция
Код: plaintext
SELECT INTO flag * FROM check_student_for_certificate( 193 ,  10 ,  5 );
работать не хочет .. вне зависимости flag int4 ili RECORD

в то время как без этого INTO работает нормально
Код: plaintext
SELECT * FROM check_student_for_certificate( 193 ,  10 ,  5 );

не знаю почему и как заставить работать ... вот это одна из ошибок в процедуре :( возможно там их куча :( но я ток неделю как освоился с ним и многого не знаю, так что плиз ногами не пинать :)
...
Рейтинг: 0 / 0
11.08.2005, 16:18
    #33210942
JackS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
составление и возврат множества композитного типа
вопрос снят, разбрался :)
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / составление и возврат множества композитного типа / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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