powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / PL SQL: как переписать хранимую функцию на обычный JOIN?
6 сообщений из 6, страница 1 из 1
PL SQL: как переписать хранимую функцию на обычный JOIN?
    #39872126
Фотография d.mityaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый вечер. Я тут вот с чем столкнулся: переводим отчеты с Oracle на SAP (СУБД Sybase). Поэтому возникла необходимость уйти от оракловых хранимых функций.

Вот такой запрос: (вникать во все не нужно, меня интересуют лишь хранимые функции kollecto.getlegalgroup_ce() и kollecto.getlegalbranch( )branch, которые нужно заменить на джоины, получив при этом тот же самый результат:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
select
1 cases,
gp. account_id,
to_char(a34.CREATION_DATE,'dd.mm.yyyy') "Дата направления запроса",
to_char(a35.CREATION_DATE,'dd.mm.yyyy') "Дата получения оригинала ПП",
kollecto.getlegalgroup_ce(a.ceid, a34.creation_date)legal_group,
kollecto.getlegalbranch(a.ceid, a34.creation_date)branch,
case when a34. account_id=a35. account_id then 1 else 0 end "Получили оригинал ПП",
lc. LAST_ACTION_CODE "Последний код",lc.ALL_CODES "Предыдущие отметки по кейсу"

FROM TVER.legal_state_duty_pay gp

JOIN kollecto.accounts a ON gp. account_id=a. account_id
JOIN KOLLECTO.legal_counter lc ON a. account_id=lc. account_id
JOIN
(select account_id, max(CREATION_DATE)CREATION_DATE
from (select ACCOUNT_ID, CREATION_DATE from KOLLECTO.ACCOUNT_COMMENTS where comment_id in (35749) /*A34-Направлен запрос в банк на получение оригинала ПП*/
union all
select ACCOUNT_ID,TRIAL_DATE from KOLLECTO.LEGAL_TRIAL where comment_id in (35749) /*A34-Направлен запрос в банк на получение оригинала ПП*/) group by account_id)A34
ON gp. account_id=a34. account_id

LEFT JOIN
(select account_id, max(CREATION_DATE)CREATION_DATE
from (select ACCOUNT_ID, CREATION_DATE from KOLLECTO.ACCOUNT_COMMENTS where comment_id in (35750) /* A35-Получен оригинал ПП от банка*/
union all
select ACCOUNT_ID,TRIAL_DATE from KOLLECTO.LEGAL_TRIAL where comment_id in (35750) /* A35-Получен оригинал ПП от банка*/) group by account_id)A35
ON a34. account_id=a35. account_id
 



Вот одна из 2х хранимых функций. Эта функция принимает 2 значения: p_ceid и p_date, возвращает v_legalgroup.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
create or replace function          getlegalgroup_ce(p_ceid kollecto.collection_entities.ceid%type,
                                                    p_date kollecto.legal_executory.creation_date%type) return varchar2 as v_legalgroup kollecto.groups.name%type;
v_first_group kollecto.groups.name%type;
v_idusr kollecto.users.idusr%type;
begin

select distinct first_value(coj.id_new_owner)over(partition by coj.ceid order by coj.begin_date desc) into v_idusr
 from tver.coj
where coj.ceid=p_ceid
  and trunc(p_date) between trunc(coj.begin_date) and trunc(coj.end_date);

select (select distinct first_value(g.name)over(partition by cuj.idusr order by cuj.begin_date desc) 
         from tver.ce_usrgroup_jnl cuj,
              kollecto.groups g
        where cuj.idgrp=g.idgrp
          and g.unique_flag=1
          --and (g.name like 'Legal_EKAT%' or g.name like 'Legal_KALUGA%' or g.name like 'Legal_VOLGA%' or g.name like 'Legal_TVER%')
          and (g.name like 'Legal%' or g.name like 'Field%')
          and cuj.idusr=v_idusr
          and trunc(p_date)<=trunc(cuj.begin_date)) into v_first_group 
 from dual;
  
select nvl((select distinct first_value(g.name)over(partition by cuj.idusr order by cuj.begin_date desc) 
             from tver.ce_usrgroup_jnl cuj,
                  kollecto.groups g
            where cuj.idgrp=g.idgrp
              and g.unique_flag=1
              --and (g.name like 'Legal_EKAT%' or g.name like 'Legal_KALUGA%' or g.name like 'Legal_VOLGA%' or g.name like 'Legal_TVER%')
              and (g.name like 'Legal%' or g.name like 'Field%')
              and cuj.idusr=v_idusr
              and trunc(p_date) between trunc(cuj.begin_date) and trunc(cuj.end_date)),v_first_group) into v_legalgroup 
 from dual;
  
return v_legalgroup;

end getlegalgroup_ce;





В общем, я тут голову уже сломал. Пытался сделать во FROM через вложенные подзапросы, но столкнулся с проблемой видимости v_idusr в другом подзапросе при расчете v_legalgroup, где на v_idusr связка идет.

Хотелось бы найти более-менее лаконичное решение, которое будет в дальнейшем использоваться вместо этой функции.
...
Рейтинг: 0 / 0
PL SQL: как переписать хранимую функцию на обычный JOIN?
    #39872134
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
d.mityaevвникать во все не нужноСударь, Вы просто феерически наглый паразит.

Если бы Вы попытались объяснить логику и предоставить пример данных, вероятно и решение появилось бы без помощи посторонних.

Но Вы предлагаете незнакомым людям из интернета разбираться в Вашем коде, который ничего кроме чувства острого отвращения не вызывает.

И главный просчёт в том, что если требуется написать запрос для Sybase, то и спрашивать стоит на форуме Sybase (накрайняк MSSQL), а не на форуме оригинала поскольку Вы не в состоянии описать логику словами.

Ваше омерзительное distinct first_value переписывается в Оракле через keep dense_rank, а в Sybase уже иначе.

Для начала рекомедуется уйти от этого, потом объединить второй и третий запрос в один, потом уже покумекать как полученное объединить с первым.

Форум предназначен для помощи по техническим вопросам, а не для того, чтоб бесплатно делать работу за некомпетентных наглых лодырей.
...
Рейтинг: 0 / 0
PL SQL: как переписать хранимую функцию на обычный JOIN?
    #39872145
Фотография d.mityaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не лодырь, я в 1й раз столкнулся с такой задачей - уйти от хранимой функции. То, что написано в хранимой функции - мне понятно, но непонятно как это переписать в сам запрос. По идее, если ее переписать на JOIN, то такой запрос будет и в Sybase работать. Хотя, по-хорошему надо бы написать хранимые функции на Sybase, чтобы каждый раз не заморачиваться с вычислением "группы юристов" (legal_group) и "подразделением" (branch), но Sybase это новая для нас СУБД, мы еще толком не знаем ее возможностей и того, чего там нет.



В хранимой функции есть 3 переременные:

1) v_idusr - по журналу смены владельцев (tver.coj) тут расчитывается последний владелец для каждого coj.ceid (это id случая просрочки уплаты по договору)

2) v_first_group - расчитывается первая группа для v_idusr (у юзера может меняться группа)

3) v_legalgroup - это уже значение, возвращаемое хранимой функцией. Тут мы с использованием ранее расчитанного v_idusr вычисляем группу, к которой относится юрист. Если эта группа NULL - заменяем её на v_first_group.

Так вот, проблема в том, что каким образом это можно переделать на JOIN? Я сомневаюсь в том, могу ли я взять и связать все таблицы, фигурирующие в хранимой функции и затем уже расчитывать то, что там было в переменных? И опять же, если связывать, какую из таблиц взять за основную "таблицу фактов" и к ней уже остальные присоединять? (боюсь, как бы данные снова не урезало)

Я пробовал это переписывать на подзапросы, с первыми 2мя перемеными - получилось, но дело застопорилось на 3-ей, т.к. мне нужно было передать в запрос и v_first_group, и v_idusr, а при их расчете distinct стоит - второе поле со значением из подзапроса так просто не воткнуть.
...
Рейтинг: 0 / 0
PL SQL: как переписать хранимую функцию на обычный JOIN?
    #39872208
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
WITH T1 AS (
            запрос1
           ),
     T2 AS (
            запрос2-c-T1-в-FROM-и-v_idusr-в-SELECT
           )
запрос3-c-T2-в-FROM



ну и самa ф-ция очень похожa на говнокод.

SY.
...
Рейтинг: 0 / 0
PL SQL: как переписать хранимую функцию на обычный JOIN?
    #39872211
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYочень похожa на говнокод.

почему похожа? говнокод и есть...
...
Рейтинг: 0 / 0
PL SQL: как переписать хранимую функцию на обычный JOIN?
    #39872224
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
d.mityaev,

Неужели действительно не видно, что второй и третий отличаются предикатом по trunc(p_date) и элементарно объединяются в один?
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / PL SQL: как переписать хранимую функцию на обычный JOIN?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]