Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
15-1144240580
syte_ser78
2006-04-05 16:36
2006.04.30
Из истории Delphimaster


2-1145004937
Der Nechk@ssoff
2006-04-14 12:55
2006.04.30
Назначение иконки файлу


15-1144571134
Ega23
2006-04-09 12:25
2006.04.30
С Днём рождения! 9 апреля


15-1144614620
Zeqfreed
2006-04-10 00:30
2006.04.30
Что почитать о поиске вхождений по маске?


15-1144503176
Yuri Btr
2006-04-08 17:32
2006.04.30
Поддержка сайта





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский