CftClub.ru
Клуб специалистов ЦФТ-Банк

Перевод/трансляция sql-запроса на синтаксис pl\plus

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Уроки ЦФТ-Банк для начинающих
Предыдущая тема :: Следующая тема  
Автор Сообщение
TAlex
Участник


Вступление в Клуб: 27.02.2015
СообщениеВт Мар 10, 2015 16:00   Перевод/трансляция sql-запроса на синтаксис pl\plus Ответить с цитатой
Полезность: Нет оценки
Добрый день, товарищи и коллеги

Можете посоветовать какие-то хитрости или трюки в решении следующей задачи:

Столкнулся с проблемой перевода огромного sql-запроса со множеством уровней вложенности, операторов case, операторов decode, вдобавок выбирающего данные из представления на pl\plus-ый синтаксис.

Есть ли какие-то автоматические переводчики (а вдруг?) или какие-то советы уже сталкивавшихся с подобной задачей товарищей?

Примечание: мне потом по курсору, возвращаемому этим диким sql-запросом нужно пробегать и выполнять разные действия над каждой строкой.
danzki
Участник - экстремал


Вступление в Клуб: 30.09.2010
СообщениеВт Мар 10, 2015 17:19    Ответить с цитатой
Полезность: Нет оценки
Транслитераторов нет. Ты запрос-то выложи, а гуру, как будет у кого свободное время, помогут
TAlex
Участник


Вступление в Клуб: 27.02.2015
СообщениеСр Мар 11, 2015 05:15    Ответить с цитатой
Полезность: Нет оценки
вот этот великий и ужасный, нуждающийся в трансляции на цфт-ый синтаксис запрос

для удобства прочтения, приложил тот же запрос в виде файла

SELECT r.C_STORNO,
r.C_STORNO_NAME,
r.C_DT,
r.C_DATE_NOTRUNC c_date,
CASE
WHEN r.c_main_smart IS NOT NULL
AND (sm.C_ACC_DT = r.C_ACC_DT OR sm.C_ACC_KT = r.C_ACC_KT)
THEN
sm.c_nazn
ELSE
r.c_nazn
END
c_nazn,
CASE
WHEN r.c_main_smart IS NOT NULL
AND (sm.C_ACC_DT = r.C_ACC_DT OR sm.C_ACC_KT = r.C_ACC_KT)
THEN
sm.c_comment
ELSE
r.c_comment
END
c_comment,
SUBSTR (
' '
|| TRIM (
CASE
WHEN r.c_main_smart IS NOT NULL
AND (sm.C_ACC_DT = r.C_ACC_DT
OR sm.C_ACC_KT = r.C_ACC_KT)
THEN
sm.c_document_num
ELSE
r.c_document_num
END),
-8)
c_document_num,
r.c_summa_dt,
r.c_summa_dt_nat,
r.c_summa_kt,
r.c_summa_kt_nat,
r.C_MAIN_SMART,
CASE
WHEN r.c_main_smart IS NOT NULL
AND (sm.C_ACC_DT = r.C_ACC_DT OR sm.C_ACC_KT = r.C_ACC_KT)
THEN
sm.c_korr_v_id
ELSE
r.c_korr_v_id
END
c_korr_v_id
FROM (SELECT *
FROM (SELECT a.C_DOC_ID,
a.C_STORNO_NAME,
a.C_STORNO,
a.C_NAZN,
a.C_COMMENT,
a.C_DOCUMENT_NUM,
a.C_KORR_V_ID,
a.C_ACC_DT,
a.C_ACC_KT,
DECODE (
a.C_DT,
'1', NVL2 (
a.c_main_smart,
SUM (
a.C_SUMMA)
OVER (
PARTITION BY a.C_MAIN_SMART, a.C_DATE),
a.C_SUMMA),
0)
c_summa_dt,
DECODE (
a.C_DT,
'1', NVL2 (
a.c_main_smart,
SUM (
a.C_SUMMA_NAT)
OVER (
PARTITION BY a.C_MAIN_SMART, a.C_DATE),
a.C_SUMMA_NAT),
0)
c_summa_dt_nat,
DECODE (
a.C_DT,
'0', NVL2 (
a.c_main_smart,
SUM (
a.C_SUMMA)
OVER (
PARTITION BY a.C_MAIN_SMART, a.C_DATE),
a.C_SUMMA),
0)
c_summa_kt,
DECODE (
a.C_DT,
'0', NVL2 (
a.c_main_smart,
SUM (
a.C_SUMMA_NAT)
OVER (
PARTITION BY a.C_MAIN_SMART, a.C_DATE),
a.C_SUMMA_NAT),
0)
c_summa_kt_nat,
a.C_DT,
a.C_DATE,
a.C_DATE_NOTRUNC,
LAST_VALUE (a.c_doc_id)
OVER (PARTITION BY a.C_MAIN_SMART, a.C_DATE)
c_smart_last_doc,
a.C_MAIN_SMART
FROM VW_RPT_ACC_MOVE_LS a) r
WHERE c_doc_id = c_smart_last_doc OR c_main_smart IS NULL) r,
(SELECT a.ID c_main_smart,
a.c_date_notrunc,
a.c_date,
a.c_acc_dt,
a.c_acc_kt,
a.c_korr_acc,
a.c_korr_v_id,
a.c_document_num,
a.c_comment,
a.c_nazn,
a.c_storno,
a.c_storno_name
FROM vw_rpt_r_main_smart_dt a
UNION ALL
SELECT a.ID c_main_smart,
a.c_date_notrunc,
a.c_date,
a.c_acc_dt,
a.c_acc_kt,
a.c_korr_acc,
a.c_korr_v_id,
a.c_document_num,
a.c_comment,
a.c_nazn,
a.c_storno,
a.c_storno_name
FROM vw_rpt_r_main_smart_kt a) sm
WHERE r.c_main_smart = sm.c_main_smart(+)
ORDER BY r.C_DATE,
r.C_DT,
r.C_SUMMA_DT,
r.C_SUMMA_KT


Последний раз редактировалось: TAlex (Ср Мар 11, 2015 05:16), всего редактировалось 1 раз
Alkov
Профи


Вступление в Клуб: 23.09.2010
СообщениеСр Мар 11, 2015 06:01    Ответить с цитатой
Полезность: Нет оценки
И в чём проблема , что уже написал и что не получилось ?
Amper
Профи


Вступление в Клуб: 29.10.2010
СообщениеСр Мар 11, 2015 06:15    Ответить с цитатой
Полезность: 4
Код:
for   (   select r( r.C_STORNO            : C_STORNO
            , r.C_STORNO_NAME         : C_STORNO_NAME
            , r.C_DT               : C_DT
            , r.C_DATE_NOTRUNC          : C_DATE
            , case
                   when r.c_main_smart is not null and (sm.C_ACC_DT = r.C_ACC_DT or sm.C_ACC_KT = r.C_ACC_KT)
                   then sm.c_nazn
                   else r.c_nazn
                end                  : c_nazn
            , case
                   when r.c_main_smart is not null and (sm.C_ACC_DT = r.C_ACC_DT or sm.C_ACC_KT = r.C_ACC_KT)
                   then sm.c_comment
                   else r.c_comment
                end                  : c_comment
            , substr('        ' || trim(
                      case
                         when r.c_main_smart is not null and (sm.C_ACC_DT = r.C_ACC_DT or sm.C_ACC_KT = r.C_ACC_KT)
                         then sm.c_document_num
                         else r.c_document_num
                      end
                  ), -Cool            : c_document_num
            , r.c_summa_dt            : c_summa_dt       
            , r.c_summa_dt_nat          : c_summa_dt_nat   
            , r.c_summa_kt              : c_summa_kt       
            , r.c_summa_kt_nat          : c_summa_kt_nat   
            , r.C_MAIN_SMART            : C_MAIN_SMART     
            , case
                   when r.c_main_smart is not null and (sm.C_ACC_DT = r.C_ACC_DT or sm.C_ACC_KT = r.C_ACC_KT)
                   then sm.c_korr_v_id
                   else r.c_korr_v_id
               end                  : c_korr_v_id
            )
      in
      (   select r(r%rowtype)
         in    
         (
            select a( a.C_DOC_ID      : C_DOC_ID
                  , a.C_STORNO_NAME   : C_STORNO_NAME
                  , a.C_STORNO        : C_STORNO
                  , a.C_NAZN          : C_NAZN
                  , a.C_COMMENT       : C_COMMENT
                  , a.C_DOCUMENT_NUM  : C_DOCUMENT_NUM
                  , a.C_KORR_V_ID     : C_KORR_V_ID   
                  , a.C_ACC_DT        : C_ACC_DT       
                  , a.C_ACC_KT        : C_ACC_KT       
                  , DECODE(a.C_DT, '1', NVL2(a.c_main_smart, analytic(SUM(a.C_SUMMA)      , 'OVER (PARTITION BY [1], [2])', a.C_MAIN_SMART, a.C_DATE), a.C_SUMMA)      , 0): c_summa_dt
                  , DECODE(a.C_DT, '1', NVL2(a.c_main_smart, analytic(SUM(a.C_SUMMA_NAT)   , 'OVER (PARTITION BY [1], [2])', a.C_MAIN_SMART, a.C_DATE), a.C_SUMMA_NAT)   , 0): c_summa_dt_nat
                  , DECODE(a.C_DT, '0', NVL2(a.c_main_smart, analytic(SUM(a.C_SUMMA)      , 'OVER (PARTITION BY [1], [2])', a.C_MAIN_SMART, a.C_DATE), a.C_SUMMA)      , 0): c_summa_kt
                  , DECODE(a.C_DT, '0', NVL2(a.c_main_smart, analytic(SUM(a.C_SUMMA_NAT)   , 'OVER (PARTITION BY [1], [2])', a.C_MAIN_SMART, a.C_DATE), a.C_SUMMA_NAT)   , 0): c_summa_kt_nat
                  , a.C_DT         : C_DT
                  , a.C_DATE         : C_DATE
                  , a.C_DATE_NOTRUNC   : C_DATE_NOTRUNC
                  , analytic(LAST_VALUE(a.c_doc_id), 'OVER (PARTITION BY [1], [2])', a.C_MAIN_SMART, a.C_DATE): c_smart_last_doc
                  , a.C_MAIN_SMART   : C_MAIN_SMART
                     )
            in VW_RPT_ACC_MOVE_LS%rowtype
         )
         where r.c_doc_id = r.c_smart_last_doc or r.c_main_smart is null
      ),
      (    select sm
               ( sm.ID            : c_main_smart
               , sm.c_date_notrunc   : c_date_notrunc
               , sm.c_date         : c_date
               , sm.c_acc_dt       : c_acc_dt
               , sm.c_acc_kt       : c_acc_kt
               , sm.c_korr_acc     : c_korr_acc
               , sm.c_korr_v_id    : c_korr_v_id
               , sm.c_document_num : c_document_num
               , sm.c_comment      : c_comment
               , sm.c_nazn         : c_nazn
               , sm.c_storno       : c_storno
               , sm.c_storno_name  : c_storno_name
               )
         in vw_rpt_r_main_smart_dt%rowtype
         union all
             select sm
               ( sm.ID          : c_main_smart
               , sm.c_date_notrunc   : c_date_notrunc
               , sm.c_date         : c_date       
               , sm.c_acc_dt       : c_acc_dt     
               , sm.c_acc_kt       : c_acc_kt     
               , sm.c_korr_acc     : c_korr_acc   
               , sm.c_korr_v_id    : c_korr_v_id   
               , sm.c_document_num : c_document_num
               , sm.c_comment      : c_comment     
               , sm.c_nazn         : c_nazn       
               , sm.c_storno       : c_storno     
               , sm.c_storno_name  : c_storno_name
               )
            in vw_rpt_r_main_smart_kt%rowtype
      )
      where r.c_main_smart = sm.c_main_smart(true)
      order by  r.C_DATE
            , r.C_DT
            , r.C_SUMMA_DT
            , r.C_SUMMA_KT
   )
loop
   null;
end loop;

Как-то так. В операции, где это будет использоваться, нужно включать "Расширенный синтаксис".
TAlex
Участник


Вступление в Клуб: 27.02.2015
СообщениеСр Мар 11, 2015 06:31    Ответить с цитатой
Полезность: Нет оценки
Amper, огромное вам спасибо.
Вы отзывчивые многих моих коллег из соседних комнат Smile.

Я начинающий разработчик ИБСО. Мне дали в руки документацию и сказали - плыву. Вот и плыву, как получается.

Ещё раз огромное вам спасибо
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеЧт Мар 12, 2015 14:24    Ответить с цитатой
Полезность: Нет оценки
TAlex пишет:
Amper, огромное вам спасибо.
Вы отзывчивые многих моих коллег из соседних комнат Smile.

в МДМ настолько змеиный коллектив ?
TAlex
Участник


Вступление в Клуб: 27.02.2015
СообщениеПт Мар 13, 2015 05:21    Ответить с цитатой
Полезность: Нет оценки
>vtar
обычный коллектив, как и везде

Просто до этого я был (и до сих пор есть) разработчик под Siebel CRM, а разработкой под ИБСО занялся с одобрения начальства факультативно (лишние знания лишними не бывают).
И получается, что я, как сибелист, сижу с сибелистами. А ибсошники сидят отдельно. И приходится мне каждый раз к ним бегать с вопросами.

А самое плохое, что мне, как новичку в ИБСО, не назначили официального "учителя". По принципу, ты программист опытный, вот тебе дока, разберёшься. Поэтому приходится подходить с глупыми вопросами новичка то к одному исбошнику, то к другому.
Но ничего, втянулся вроде.

А коллектив в МДМ-е нормальный. Обычный такой коллектив.
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Уроки ЦФТ-Банк для начинающих Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru