Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вызов одной ХП внутри другой [D7, FireBird]


Megabyte ©   (2006-03-09 14:58:00) 

БД учета школы(персонал(директор, учителя), ученики,предметы, классы, расписание, оценки). Нужно 2 ХП. В одной(уже написал) выбираются все оценки одного ученика за определенный период по одному предмету.

create procedure sredniy_ball(uchenik_ID integer,
predmet_nazvanie varchar(20), min_date date, max_date date)
returns(ocenka_date date, ocenka_znachenie integer,
ocenka_redmet varchar(20))
begin
    for select O.o_data, O.znachenie, P.p_nazvanie
        from uchenik U, Ocenka O, predmet P
        where (U.u_id = :uchenik_ID) and
        (P.p_nazvanie = :predmet_nazvanie) and
        (O.o_data between :min_date and :max_date) and
        (O.u_id = U.u_id) and (O.o_id = P.p_id)
        into :ocenka_date, :ocenka_znachenie, :ocenka_predmet
    do
        suspend;
end

Другая процедура должна подсчитывать средний балл для одного ученика по данному предмету. Т.к. большая часть кода будет такой же, решил использовать 1-ю ХП внутри другой(опыт нулевой по данному вопросу).
Но вот в этом и загвоздка. В книжке пример другой, не помог. Там внутренняя ХП возвращает одно значение. А у меня список. Мне надо вычислить из списка оценок среднее значение.
Вот код 2-й ХП(как я себе это примерно представяю), но он не работает:
create procedure sredniy_ball(uchenik_ID integer,
predmet_nazvanie varchar(20), min_date date, max_date date)
returns(srednaya_ocenka integer, sred_predmet varchar(20))
as
begin
    execute procedure ocenki_po_predmetu(:uchenik_ID,
    :predmet_nazvanie, :min_date, :max_date)
    returning_values :ocenka_znachenie, :ocenka_predmet;
    select AVG(Oc.ocenka_znachenie), Oc.ocenka_predmet
    from ocenki_po_predmetu Oc
end

Непонятно, как брать значения из 1-й ХП.
По идее м.б. использовать
execute procedure ocenki_po_predmetu(:uchenik_ID,
    :predmet_nazvanie, :min_date, :max_date)
  returning_values :ocenka_znachenie, :ocenka_predmet;

в цикле, но проще же использовать агрегатную функцию AVG.
Т.е. как мне в select использовать другую ХП?


Megabyte   (2006-03-09 18:09:00) [1]


> Romkin ©   (09.03.06 15:09) [4]
> Если тебе нужны все значения, то не execute, а тот же самый
> for select:

Да не, мне как бы нужно среднее значение по всем значениям из 1-й ХП.
Просто в книжке не совсем корректно, по ходу, выразились. Написано, чтобы вызвать другую ХП в теле данной, надо вызывать именно Execute, и один примитивный пример.
create procedure sredniy_ball(uchenik_ID integer,
predmet_nazvanie varchar(20), min_date date, max_date date)
returns(srednaya_ocenka integer, sred_predmet varchar(20))
as
begin
    select AVG(Oc.ocenka_znachenie)
    from ocenki_po_predmetu(:uchenik_ID,
    :predmet_nazvanie, :min_date, :max_date) Oc
    into :srednaya_ocenka;
    suspend;
end

Не сразу рюхнул, что параметры в процедуру можно подставить в секции FROM. Всем спасибо.


Виталий Панасенко   (2006-03-09 15:12:00) [2]

select avg(ocenka_znachenie) from first_SP


Romkin   (2006-03-09 15:09:00) [3]

Если тебе нужны все значения, то не execute, а тот же самый for select:

for select ocenka_znachenie, :ocenka_predmet
 from ocenki_po_predmetu(:uchenik_ID, :predmet_nazvanie, :min_date, :max_date)
 into :ocenka_znachenie, :ocenka_predmet
do ...


Mikhail V   (2006-03-09 15:08:00) [4]

Что-то наподобие

create procedure sredniy_ball(uchenik_ID integer,
predmet_nazvanie varchar(20), min_date date, max_date date)
returns(srednaya_ocenka integer, sred_predmet varchar(20))
as
begin
   for select
     AVG(p.ocenka_znachenie)
   from ocenki_po_predmetu(:uchenik_ID,
   :predmet_nazvanie, :min_date, :max_date) p
   into
     :sredniaya_ozenla
  do
 suspend;
end


Megabyte   (2006-03-09 15:05:00) [5]

Стандартный запрос, кот. будет часто вызываться. Да это не важно. На будущее пригодится знать, как это делается.


Sergey13   (2006-03-09 15:03:00) [6]

А зачем ХП? Почему не просто запросом?


Наверх

Титульная страница Поиск, карта сайта Написать письмо