Форум: "Базы";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];
ВнизКак иммитировать case в запросе в хранимке ? Найти похожие ветки
← →
ANB © (2006-08-24 14:30) [0]Наступил на оракловую граблю :
Написал и отладил запрос, запихнул его в хранимку - хранимка не компиляется. Ругается на использование case в запросе.
Как бы это обойти ?
Можно, конечно, вытащить все нужные поля и ифом разрулить, но как то некузяво это и полей не мало.
← →
Sergey13 © (2006-08-24 14:38) [1]А ты этот запрос через execute_immediate не пробовал выполнить?
← →
ANB © (2006-08-24 15:12) [2]
> Sergey13 © (24.08.06 14:38) [1]
Издеваешься ? Тогда уж проще ифом разруливать. Мне циклом по нему пройти нужно. Через for R in () loop - самый удобный способ.
← →
Sergey13 © (2006-08-24 15:20) [3]> [2] ANB © (24.08.06 15:12)
> Издеваешься ?
Отнють. Почем я знал, что за запрос.
>Ругается на использование case в запросе.
Ошибку опубликуй.
← →
ANB © (2006-08-24 16:51) [4]FUNCTION get_currency_name_decline (p_cur_inner_code VARCHAR2, p_num INTEGER)
RETURN VARCHAR2
IS
v_r currency.currname%TYPE;
BEGIN
SELECT CASE
WHEN p_num = 1
THEN c.currmnem
ELSE c.currsname
END
INTO v_r
FROM currency c
WHERE c.currcode = p_cur_inner_code;
RETURN v_r;
END;
Ошибка :
PLS-00103: Встретился символ "CASE" в то время как ожидалось одно из следующих:
( * - + all mod null <an identifier>
<a double-quoted delimited-identifier> <a bind variable>
table avg count
← →
ANB © (2006-08-24 16:52) [5]Ну, это процедурка попроще, тот запрос, в котором мне нужно case иммитировать больно здоровый.
← →
Desdechado © (2006-08-24 17:34) [6]Посмотри в сторону функции DECODE и COALESCE.
CASE в PL-SQL имеет другой синтаксис, процедурный.
← →
Reindeer Moss Eater © (2006-08-24 17:58) [7]В девятке второго релиза и старше кейс доступен и в SQL и в PL/SQL
← →
ANB © (2006-08-24 18:01) [8]
> Desdechado © (24.08.06 17:34) [6]
decode не пройдет, т.к. условие непростое, логическое. Похоже у нас сервак старый.
← →
Reindeer Moss Eater © (2006-08-24 18:03) [9]Если уж decode не подойдет, то тогда задача нерешаема.
Потому что decode - просто чума.
:)
← →
ANB © (2006-08-24 18:11) [10]Млин, так и знал - у нас 8-ка. Придется ифом изгалятся.
← →
Petr V. Abramov © (2006-08-24 20:38) [11]> decode не пройдет, т.к. условие непростое, логическое.
да наверняка можно извратиться.
условие - в студию, для разминки мозгов:)
← →
evvcom © (2006-08-25 09:08) [12]> [6] Desdechado © (24.08.06 17:34)
Здесь case именно в SQL. В 9-ке такой select на раз-два пройдет.
2 ANB: если в условии нет знаков больше/меньше, то decode наверняка пройдет. Давай [11].
← →
evvcom © (2006-08-25 09:11) [13]
> [0] ANB © (24.08.06 14:30)
> Написал и отладил запрос, запихнул его в хранимку - хранимка
> не компиляется. Ругается на использование case в запросе.
Кстати, а в запросе такое проходило? Странно... И в хранимке тогда должно.
← →
ANB © (2006-08-25 09:12) [14]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
← →
ANB © (2006-08-25 09:16) [15]
> Кстати, а в запросе такое проходило? Странно... И в хранимке
> тогда должно.
Это 8-ка, млин. Серваков много, я только устроился. Спросил какая версия - сказали 9-ка (и клиента 9-го поставил). Написал запрос, отладил, вставляю в хранимку (это отчет), не компиляется. Помучился, в where части переделал на обычную логику, а в селековой - застрял. На такие грабли давно не наступал (на 10-ке до этого работал). Потом догадался селекнуть верси. сервака - а там 8-ка. Мать его за ногу.
← →
roottim © (2006-08-25 09:24) [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)
← →
evvcom © (2006-08-25 09:27) [17]> [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)
вроде так, попробуй
← →
evvcom © (2006-08-25 09:28) [18]> [16] roottim © (25.08.06 09:24)
опередил :)
← →
ANB © (2006-08-25 09:31) [19]офигеть. Не, оно с ифом как то легче читается. Мне еще код с аналитиком смотреть (намутила в подстановке, пока ее нет, начальница велела сделать по написанному, убрав явные ляпы, а потом с аналитиком и довести до ума). Если я ей этот набор декодов покажу, у нее крыша поедет :)
Все равно всем спасибо, идею я понял, буду пользоваться.
← →
roottim © (2006-08-25 09:49) [20]в случае =, != decode такого вида тебя спасет,
в иных ситуациях (>, <) придется иметь decode(sign(val1-val2), 1, .., -1, 0, ...) а вообще пора версию менять
← →
ANB © (2006-08-25 10:10) [21]
> а вообще пора версию менять
ее сначала надо во всех банках поменять :(
← →
evvcom © (2006-08-25 10:19) [22]> [19] ANB © (25.08.06 09:31)
> Не, оно с ифом как то легче читается.
но несколько селектов придется делать. Если они "легкие" еще куда ни шло, а если строк на 50? :)
Кстати, еще 2 селекта через union all можешь сделать. Но, имхо, лучше с decode. Добавь просто комментарий, что этот decode аналогичен твоему case, который легче читается.
← →
ANB © (2006-08-25 11:03) [23]
> но несколько селектов придется делать
не, не придется. Вся инфа берется из запроса.
получилось вот так :
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 11:15) [24]> [23] ANB © (25.08.06 11:03)
Чего-то не понял. У тебя ж в if алиасы? И как ты это к SQL прикрутил? В SQL же нет if. :?)
Покажи весь код.
← →
roottim © (2006-08-25 11:21) [25]Он в цикле по курсору это if вставит
> Мне циклом по нему пройти нужно. Через for R in () loop
← →
ANB © (2006-08-25 11:26) [26]
> Он в цикле по курсору это if вставит
Я его туда и вставил. R - имя курсорной записи.
Отчет формируется построчно, все равно по курсору надо гулять. Система так устроена. типа "исторически".
← →
evvcom © (2006-08-25 11:29) [27]> [25] roottim © (25.08.06 11:21)
А... Понятно. Не..., я лучше хитрый case/decode напишу, если возможно, но в одном SQL, чем несколько курсоров и циклами их потом еще лопатить. Так гемора меньше. Так потом ЭТО еще в виде результирующего курсора выдать клиенту. Через function pipelined? Кстати, их в 8-ке тоже, по-моему, нет, там какой-то другой способ Кайт описывал.
← →
ANB © (2006-08-25 11:45) [28]
> Так потом ЭТО еще в виде результирующего курсора выдать
> клиенту.
Не, курсоры наш клиент не ест. Чтобы вывести отчет, надо закинуть все в PL/SQL табличку, а оттуда клиент все сам достанет и напечатает.
Клиент то еще консольный.
← →
evvcom © (2006-08-25 11:51) [29]> [28] ANB © (25.08.06 11:45)
> Не, курсоры наш клиент не ест.
> Клиент то еще консольный.
Да... Тяжело вашему клиенту...
← →
ANB © (2006-08-25 16:59) [30]
> Да... Тяжело вашему клиенту...
Зато на турбо-паскале еще писать начинали :)
← →
Petr V. Abramov © (2006-08-28 00:22) [31]> ANB © (25.08.06 16:59) [30]
запишите этот decode "лесенкой", и будет читабельней, чем case
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.063 c