Форум: "Базы";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];
ВнизВызов одной ХП внутри другой Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.011 c