Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как иммитировать case в запросе в хранимке ? [Oracle]


Страницы:   1 2

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].


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо