Перевод/трансляция sql-запроса на синтаксис pl\plus
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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
), - : 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, огромное вам спасибо.
Вы отзывчивые многих моих коллег из соседних комнат .
Я начинающий разработчик ИБСО. Мне дали в руки документацию и сказали - плыву. Вот и плыву, как получается.
Ещё раз огромное вам спасибо |
|
 |
vtar Эксперт
Вступление в Клуб: 20.03.2009
|
Чт Мар 12, 2015 14:24   |
|
Полезность: Нет оценки
|
TAlex пишет: | Amper, огромное вам спасибо.
Вы отзывчивые многих моих коллег из соседних комнат .
|
в МДМ настолько змеиный коллектив ? |
|
 |
TAlex Участник
Вступление в Клуб: 27.02.2015
|
Пт Мар 13, 2015 05:21   |
|
Полезность: Нет оценки
|
>vtar
обычный коллектив, как и везде
Просто до этого я был (и до сих пор есть) разработчик под Siebel CRM, а разработкой под ИБСО занялся с одобрения начальства факультативно (лишние знания лишними не бывают).
И получается, что я, как сибелист, сижу с сибелистами. А ибсошники сидят отдельно. И приходится мне каждый раз к ним бегать с вопросами.
А самое плохое, что мне, как новичку в ИБСО, не назначили официального "учителя". По принципу, ты программист опытный, вот тебе дока, разберёшься. Поэтому приходится подходить с глупыми вопросами новичка то к одному исбошнику, то к другому.
Но ничего, втянулся вроде.
А коллектив в МДМ-е нормальный. Обычный такой коллектив. |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|