![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов одной ХП внутри другой [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]А зачем ХП? Почему не просто запросом?