Форум: "Базы";
Текущий архив: 2007.04.29;
Скачать: [xml.tar.bz2];
ВнизХранимая процедура : выбор записей + количество по полю Найти похожие ветки
← →
valua (2007-02-07 17:56) [0]Господа , здравствуйте !
Вопрос такой . Необходимо выбрать записи и подсчитать количество записей для поля К_СЕХ , т.е. должно быть так
------------------------------------
K_CEX count(k_cex)
------------------------------------
5 20
10 25
50 40
66 10
и т. д.
Все примеры даны для запросов . Мне хотелось бы написать хранимую процедуру . Текст процедуры ниже :
BEGIN
for SELECT
p.KOD,
p.KOD_LK,
p.K_CEX,
p.K_KAT,
p.K_PROF,
p.K_OSN,
p.PRIZ,
count(k_cex)
FROM PEREM P
where ((p.priz = :priz1) and ((p.k_osn = :k_osn1) or (p.k_osn = :k_osn2)))
group by p.k_cex
INTO
:KOD,
:KOD_LK,
:K_CEX,
:K_KAT,
:K_PROF,
:K_OSN,
:PRIZ,
:kol /* для count */
do suspend;
END
дает ошибку :
invalid column reference.
Господа в чем причина , как правильно написать хранимую процедуру ?
Только не надо лишних вопросов , типа - зачем это надо , прошу конретных ответов .
Всем спасибо .
← →
Johnmen © (2007-02-07 18:02) [1]Причина в незнании команды SELECT в части группировки (GROUP BY).
А именно, группировать можно только по полям, указанным в списке выбираемых. Иначе, как, напр., у тебя, это абсурдно, т.е. лишено всякого смысла...
← →
valua (2007-02-09 18:23) [2]> Johnmen © (07.02.07 18:02) [1]
Причина в незнании команды SELECT в части группировки (GROUP BY).
А именно, группировать можно только по полям, указанным в списке выбираемых. Иначе, как, напр., у тебя, это абсурдно, т.е. лишено всякого смысла...
Причина была не в незнании команды SELECT в части группировки (GROUP BY) , а языке хранимых процедур , если бы я знала , то не задавала бы вопросы . В хранимых процедурах несколько иная запись такого запроса и все имеет смысл .
Все хорошо получается если делаю по одного условия , а если совмещаю
два условия не могу обнулить суммы , пример :
результат выполнения процедуры ->
--------------------------------------------------------------------------
K_CEX count(k_cex) - 1 условие count(k_cex) - 2 условие
---------------------------------------------------------------------------
5 20 20
10 25 25
50 40 40
66 10 10
83 2 5
а должно быть ->
--------------------------------------------------------------------------
K_CEX count1(k_cex) - 1 условие count2(k_cex) - 2 условие
---------------------------------------------------------------------------
5 20 0
10 25 0
50 0 40
66 10 0
83 2 5
если при 1 условии сумма = 0 , то в count1(k_cex) - 1 условие должен был быть 0 и наоборот .
Процедура :
BEGIN
FOR SELECT distinct PQ.K_CEX
FROM PEREM PQ,
perem_prin(:k_osn1,:k_osn2,:PER1,:PER2,:PRIZ1,:PRIZ2,:K_REG1) PR, - 1 услов
perem_uvol(:k_osn3,:k_osn4,:PER1,:PER2,:PRIZ1,:PRIZ2,:K_REG1) PU - 2 усл
where (PQ.k_cex = PU.K_CEX) or (Pq.k_cex = PR.K_CEX)
into :k_cex
DO
BEGIN
/* - 1 условие */
SELECT P1.KOD
P1.K_CEX,
P1.KOL_CEX
FROM perem_prin_count(:k_osn1,:k_osn2,:PER1,:PER2,:PRIZ1,:PRIZ2,:K_REG1) P1
where (P1.k_cex = :k_cex)
INTO :KOD,
:K_CEX,
:kol_cex;
if (KOL_CEX is null) then KOL_CEX = 0; - пробовала всталять эту строку - не работает
/* 2 условие */
SELECT P.KOD,
P.K_CEX,
P.KOL_CEXU
FROM perem_uvol_cou_cex(:k_osn3,:k_osn4,:PER1,:PER2,:PRIZ1,:PRIZ2,:K_REG1) P
where (P.k_cex = :k_cex)
INTO :KOD,
:K_CEX,
:kol_cexu;
if (KOL_CEXU is null) then KOL_CEXU = 0; - пробовала всталять эту строку - не работает
SUSPEND;
END
END
Господа , может быть кто-то сталкивался с такой проблемой , как мне правильно записать в хранимой процедуре , чтобы выполнялось условие , где сумма 0 - в результате выполнения тоже 0 .
Всем спасибо .
P. S. просьба отвечать по существу без ответов по типу предыдущего , если бы я знала , то не задавала бы вопрос .
← →
Desdechado © (2007-02-09 18:30) [3]> В хранимых процедурах несколько иная запись такого запроса и все имеет смысл
"Запись" запросов там абсолютно одинаковая.
PS Если данных нет, то SELECT INTO не очищает переменную. Поэтому ее нужно очищать заранее.
← →
Johnmen © (2007-02-09 18:32) [4]
> Причина была не в незнании команды SELECT в части группировки
> (GROUP BY) , а языке хранимых процедур
Блажен, кто верует.
ЗЫ
Кстати, СУБД почему-то до сих пор не озвучена.
← →
Desdechado © (2007-02-09 18:40) [5]Johnmen © (09.02.07 18:32) [4]
Судя по синтаксису, какой-то из IB-клонов. ORA ведет себя иначе в SELECT INTO.
← →
Johnmen © (2007-02-09 18:46) [6]
> Desdechado © (09.02.07 18:40) [5]
Да-да. Даже телепатор самой простой конструкции говорит о том же :)
И что меня улыбает, так это безапелляционная уверенность некоторых вопрошающих в своих "знаниях". Откуда только они их берут?????
← →
Val © (2007-02-09 19:03) [7]>[6] Johnmen ©
сейчас тебя еще раз поругают :)
← →
Johnmen © (2007-02-09 19:17) [8]
> Val © (09.02.07 19:03) [7]
> сейчас тебя еще раз поругают :)
Обычное дело, я уже привык...:)
Поругать-то проще, чем открыть учебник или просто элементарно подумать...
← →
valua (2007-02-12 09:04) [9]Desdechado © (09.02.07 18:30) [3]
> В хранимых процедурах несколько иная запись такого запроса и все имеет смысл
"Запись" запросов там абсолютно одинаковая.
PS Если данных нет, то SELECT INTO не очищает переменную. Поэтому ее нужно очищать заранее
Спасибо , обнулила в вызываемой процедуре и все получилось .
P. S. Я не отрицаю , что другие мастера такие гении в программировании , но зачем же дурачить других .
Если бы мы все знали , если бы мы были такими же гениями , то не обращались бы к вам . Если человек знал о чем идет речь , он все понял и дал ответ по существу .
← →
ЮЮ © (2007-02-12 10:06) [10]
> , но зачем же дурачить других .
Вот именно!!! Зачем приводить процедуру в [0], если нужно исправить процедуру в [2], в которой никаких count(k_cex) нет ?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2007.04.29;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.042 c