![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как иммитировать case в запросе в хранимке ? [Oracle]
ANB © (2006-08-24 14:30:00)Наступил на оракловую граблю :
Написал и отладил запрос, запихнул его в хранимку - хранимка не компиляется. Ругается на использование case в запросе.
Как бы это обойти ?
Можно, конечно, вытащить все нужные поля и ифом разрулить, но как то некузяво это и полей не мало.
Petr V. Abramov (2006-08-28 00:22:00) [1]> ANB © (25.08.06 16:59) [30]
запишите этот decode "лесенкой", и будет читабельней, чем case
ANB (2006-08-25 16:59:00) [2]
> Да... Тяжело вашему клиенту...
Зато на турбо-паскале еще писать начинали :)
evvcom (2006-08-25 11:51:00) [3]> [28] ANB © (25.08.06 11:45)
> Не, курсоры наш клиент не ест.
> Клиент то еще консольный.
Да... Тяжело вашему клиенту...
ANB (2006-08-25 11:45:00) [4]
> Так потом ЭТО еще в виде результирующего курсора выдать
> клиенту.
Не, курсоры наш клиент не ест. Чтобы вывести отчет, надо закинуть все в PL/SQL табличку, а оттуда клиент все сам достанет и напечатает.
Клиент то еще консольный.
evvcom (2006-08-25 11:29:00) [5]> [25] roottim © (25.08.06 11:21)
А... Понятно. Не..., я лучше хитрый case/decode напишу, если возможно, но в одном SQL, чем несколько курсоров и циклами их потом еще лопатить. Так гемора меньше. Так потом ЭТО еще в виде результирующего курсора выдать клиенту. Через function pipelined? Кстати, их в 8-ке тоже, по-моему, нет, там какой-то другой способ Кайт описывал.
ANB (2006-08-25 11:26:00) [6]
> Он в цикле по курсору это if вставит
Я его туда и вставил. R - имя курсорной записи.
Отчет формируется построчно, все равно по курсору надо гулять. Система так устроена. типа "исторически".
roottim (2006-08-25 11:21:00) [7]Он в цикле по курсору это if вставит
> Мне циклом по нему пройти нужно. Через for R in () loop
evvcom (2006-08-25 11:15:00) [8]> [23] ANB © (25.08.06 11:03)
Чего-то не понял. У тебя ж в if алиасы? И как ты это к SQL прикрутил? В SQL же нет if. :?)
Покажи весь код.
ANB (2006-08-25 11:03:00) [9]
> но несколько селектов придется делать
не, не придется. Вся инфа берется из запроса.
получилось вот так :
IF ( (p_checksum = 1)
AND (r.dbcurrcode != p_currcodesum)
AND (r.krcurrcode = p_currcodesum)
AND (r.dbcurrcode != v_nationalcurr)
)
THEN
v_sum_val := r.sumkrval;
ELSE
v_sum_val := r.sumval;
END IF;
evvcom (2006-08-25 10:19:00) [10]> [19] ANB © (25.08.06 09:31)
> Не, оно с ифом как то легче читается.
но несколько селектов придется делать. Если они "легкие" еще куда ни шло, а если строк на 50? :)
Кстати, еще 2 селекта через union all можешь сделать. Но, имхо, лучше с decode. Добавь просто комментарий, что этот decode аналогичен твоему case, который легче читается.
ANB (2006-08-25 10:10:00) [11]
> а вообще пора версию менять
ее сначала надо во всех банках поменять :(
roottim (2006-08-25 09:49:00) [12]в случае =, != decode такого вида тебя спасет,
в иных ситуациях (>, <) придется иметь decode(sign(val1-val2), 1, .., -1, 0, ...) а вообще пора версию менять
ANB (2006-08-25 09:31:00) [13]офигеть. Не, оно с ифом как то легче читается. Мне еще код с аналитиком смотреть (намутила в подстановке, пока ее нет, начальница велела сделать по написанному, убрав явные ляпы, а потом с аналитиком и довести до ума). Если я ей этот набор декодов покажу, у нее крыша поедет :)
Все равно всем спасибо, идею я понял, буду пользоваться.
evvcom (2006-08-25 09:28:00) [14]> [16] roottim © (25.08.06 09:24)
опередил :)
evvcom (2006-08-25 09:27:00) [15]> [14] ANB © (25.08.06 09:12)
decode(p_checksum, 1,
decode(r.dbcurrcode, p_currcodesum, r.sumval, v_nationalcurr, r.sumval,
decode(r.krcurrcode, p_currcodesum, r.sumkrval, r.sumval)
),
r.sumval)
вроде так, попробуй
roottim (2006-08-25 09:24:00) [16]Попробуй так
decode(p_checksum, 1,
decode(r.krcurrcode, p_currcodesum,
decode(r.dbcurrcode, p_currcodesum, r.sumval,
decode(r.dbcurrcode, v_nationalcurr, r.sumval, r.sumkrval)
)
r.sumval),
r.sumval)
ANB (2006-08-25 09:16:00) [17]
> Кстати, а в запросе такое проходило? Странно... И в хранимке
> тогда должно.
Это 8-ка, млин. Серваков много, я только устроился. Спросил какая версия - сказали 9-ка (и клиента 9-го поставил). Написал запрос, отладил, вставляю в хранимку (это отчет), не компиляется. Помучился, в where части переделал на обычную логику, а в селековой - застрял. На такие грабли давно не наступал (на 10-ке до этого работал). Потом догадался селекнуть верси. сервака - а там 8-ка. Мать его за ногу.
ANB (2006-08-25 09:12:00) [18]select
case
when ( (p_checksum = 1)
AND (r.dbcurrcode != p_currcodesum)
AND (r.krcurrcode = p_currcodesum)
AND (r.dbcurrcode != v_nationalcurr)
)
THEN
r.sumkrval;
else
r.sumval
end
from R
evvcom (2006-08-25 09:11:00) [19]
> [0] ANB © (24.08.06 14:30)
> Написал и отладил запрос, запихнул его в хранимку - хранимка
> не компиляется. Ругается на использование case в запросе.
Кстати, а в запросе такое проходило? Странно... И в хранимке тогда должно.
evvcom (2006-08-25 09:08:00) [20]> [6] Desdechado © (24.08.06 17:34)
Здесь case именно в SQL. В 9-ке такой select на раз-два пройдет.
2 ANB: если в условии нет знаков больше/меньше, то decode наверняка пройдет. Давай [11].