Главная страница
    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.009 c
1-1143086318
walkernet
2006-03-23 06:58
2006.04.30
Как можно программно переместить курсор мыши?


15-1144330086
NightLord
2006-04-06 17:28
2006.04.30
Неожиданный поворот событий


4-1139556912
drpass
2006-02-10 10:35
2006.04.30
Перехват LockWorkstation


2-1144736119
lionmen
2006-04-11 10:15
2006.04.30
Срочно!!!


2-1145022199
my_sweet
2006-04-14 17:43
2006.04.30
удаление данных из файла *. db





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский