Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.046 c
15-1159782235
kyn66
2006-10-02 13:43
2006.10.22
Demo для TMS-компонентов


2-1159851131
aht
2006-10-03 08:52
2006.10.22
окно формы поверх остальных окон


15-1159674869
Fedia
2006-10-01 07:54
2006.10.22
ссылка на рейтинг функций, аналогов Pos


6-1147450761
serko
2006-05-12 20:19
2006.10.22
TNMHTTP


1-1157757381
tio
2006-09-09 03:16
2006.10.22
сделать невидимым процесс своей программы в XP





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