Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.30;
Скачать: CL | DM;

Вниз

Вызов одной ХП внутри другой   Найти похожие ветки 

 
Megabyte ©   (2006-03-09 14:58) [0]

БД учета школы(персонал(директор, учителя), ученики,предметы, классы, расписание, оценки). Нужно 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 использовать другую ХП?


 
Sergey13 ©   (2006-03-09 15:03) [1]

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


 
Megabyte ©   (2006-03-09 15:05) [2]

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


 
Mikhail V ©   (2006-03-09 15:08) [3]

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

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


 
Romkin ©   (2006-03-09 15:09) [4]

Если тебе нужны все значения, то не 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 ...


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

select avg(ocenka_znachenie) from first_SP


 
Megabyte ©   (2006-03-09 18:09) [6]


> 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. Всем спасибо.



Страницы: 1 вся ветка

Текущий архив: 2006.04.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.025 c
2-1145006301
031178
2006-04-14 13:18
2006.04.30
Delphi + Access


15-1144358561
Gero
2006-04-07 01:22
2006.04.30
Поклонникам Opera посвящается


15-1144403920
Ega23
2006-04-07 13:58
2006.04.30
Случайно буду в Москве с ночёвкой.


15-1144305481
patephon
2006-04-06 10:38
2006.04.30
Распилить фильм


9-1129016242
max999
2005-10-11 11:37
2006.04.30
Нормаль в OpenGL