Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.22;
Скачать: CL | DM;

Вниз

Как иммитировать 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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.03 c
1-1157801018
guav
2006-09-09 15:23
2006.10.22
Прозрачный ТМемо


4-1149174309
Валерий
2006-06-01 19:05
2006.10.22
Закрыть Internet Explorer


3-1156277627
иван8511
2006-08-23 00:13
2006.10.22
Фильтр для символов


8-1143237291
Тфьу
2006-03-25 00:54
2006.10.22
Как скопировать треугольную область?


15-1159269184
Knight
2006-09-26 15:13
2006.10.22
Программы направления "Домашняя бухгалтерия"