Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / left join pipeline функция возвращает параметры через раз / 11 сообщений из 11, страница 1 из 1
18.10.2018, 14:51
    #39719414
Crazy_Wolf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join pipeline функция возвращает параметры через раз
Приветсвую ALL.
Возник вопрос, в ходе переписывания большого запроса возникло желание сделать аналог SQL OUTER APPLY с помощь pipline функции
сделал тип
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
type fackt_act_row IS record (
     act_id VARCHAR2(16),      
     ks_number VARCHAR2(255),  
     ku_id VARCHAR2(16), 
     dogovor_id VARCHAR2(16),         
     invc_ks_id VARCHAR2(16)           
     );
     
type tbl_fackt_act is table of fackt_act_row;



функцию
Код: 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.
function get_fackt_act(invoice_ks_id  varchar2, data1 in date, data2 IN date) return tbl_fackt_act pipelined
  is
  begin
    
    for i in (  
            SELECT
                  ks.id as act_id,
                  ks.number as ks_number,
                  ku.id as ku_id,
                  ks.dogovorid as dogovor_id ,
                  invoice_ks_id as invc_ks_id
             FROM ks
             INNER link_tbl ON  link_tbl.code = '11' 
                                         AND link_tbl.sub_code = '25'
                                         AND link_tbl.ks_id = ks.id
                                         AND link_tbl.invoice_id =invoice_ks_id 
             INNER JOIN ku on ku.ks_id =ks.id
             WHERE ks.vid=333 
                   AND ks.ddate BETWEEN data1 AND data2  
                        
              ) loop
                pipe row (i);
              end loop;
            return;
  end;



приджойнил в основной запрос

Код: plsql
1.
2.
3.
4.
LEFT OUTER JOIN table(PK_AUTO_ACTS.get_fackt_act(invoice.id
                                              ,date_start
                                              ,date_end
   ) ) act_fact on invoice.id = act_fact. invc_ks_id



в результате запрос работает прекрасно за одним исключением, примерно в 20 процентов случаях данные этой функции не возвращаются, делаешь рефреш - все в порядке.
Вопрос, как сделать правильно, чтобы оно работало
ЗЫ Oracle 11.2
...
Рейтинг: 0 / 0
18.10.2018, 14:58
    #39719415
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join pipeline функция возвращает параметры через раз
Код: plsql
1.
2.
3.
4.
LEFT OUTER JOIN table(PK_AUTO_ACTS.get_fackt_act(invoice.id
                                              ,date_start
                                              ,date_end
   ) ) act_fact on invoice.id = act_fact. invc_ks_id

С какой стати left join должен выполнять функцию с параметрами на каждую левую строку. table-коррелят присоединяется к источнику запятой.
...
Рейтинг: 0 / 0
18.10.2018, 15:48
    #39719447
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join pipeline функция возвращает параметры через раз
-2-С какой стати left join должен выполнять функцию с параметрами на каждую левую строку. table-коррелят присоединяется к источнику запятой.А с какой стати не должен, если уж оракловая реализация внешней левости с табличной функцией позволяет функции видеть атрибут левой строки как входной параметр?

Если уж синтаксис позволяет, то под капотом должно преобразовываться во что-то типа
Код: plsql
1.
2.
3.
4.
5.
,LATERAL (SELECT *
            FROM TABLE(PK_AUTO_ACTS.GET_FACKT_ACT(INVOICE.ID,
                                                  DATE_START,
                                                  DATE_END)) ACT_FACT
           WHERE INVOICE.ID = ACT_FACT. INVC_KS_ID)(+)
...
Рейтинг: 0 / 0
18.10.2018, 15:51
    #39719451
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join pipeline функция возвращает параметры через раз
КобанчегЕсли уж ансишный синтаксис в Оракле позволяет GET_FACKT_ACT видеть INVOICE.IDFixed.
...
Рейтинг: 0 / 0
18.10.2018, 15:52
    #39719455
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join pipeline функция возвращает параметры через раз
Кобанчегесли уж оракловая реализация внешней левости с табличной функцией позволяет (+) задокументирован для этой цели.
...
Рейтинг: 0 / 0
18.10.2018, 16:02
    #39719461
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join pipeline функция возвращает параметры через раз
-2-Кобанчегесли уж оракловая реализация внешней левости с табличной функцией позволяет (+) задокументирован для этой цели.Этого я не отрицаю.

Но анси ситаксис должен
либо выдавать ошибку (как в МССКЛ до явного указания outer apply)
либо возвращать корректный результат

outer apply, кстати, менее гибок, т.к. не позволяет указывать pre-join предикат.
Так что допустимость подобного для анси левого внешнего весьма предпочтительна для нелюбителей запятых.
...
Рейтинг: 0 / 0
18.10.2018, 16:05
    #39719464
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join pipeline функция возвращает параметры через раз
Crazy_Wolfприджойнил в основной запрос

Код: plsql
1.
2.
3.
4.
LEFT OUTER JOIN table(PK_AUTO_ACTS.get_fackt_act(invoice.id
                                              ,date_start
                                              ,date_end
   ) ) act_fact on invoice.id = act_fact. invc_ks_id

Вопрос, как сделать правильно, чтобы оно работало
ЗЫ Oracle 11.2

Вот так попробуйте:
Код: plsql
1.
2.
select inv.*, tab.*
from invoice inv, table(PK_AUTO_ACTS.get_fackt_act(inv.id, date_start, date_end))(+) tab


это т.н. "лево-коррелированное" соединение, дополнительных предикат не требуется.
Плюсик-в-скобках - означает внешнее.
...
Рейтинг: 0 / 0
18.10.2018, 16:12
    #39719468
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join pipeline функция возвращает параметры через раз
Кобанчегouter apply, кстати, менее гибок, т.к. не позволяет указывать pre-join предикат без дополнительной inline viewFixed.
...
Рейтинг: 0 / 0
19.10.2018, 06:37
    #39719647
Crazy_Wolf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join pipeline функция возвращает параметры через раз
Спасибо за советы, тут вот еще на stackoverflow
нашлась такая тема , вопрос там про другое, но меня привлекла запись
Код: plsql
1.
LEFT JOIN  table(MY_PACK.runPipe(td.id)) s ON 1 = 1;


Попробовал у себя заменить
Код: plsql
1.
2.
3.
4.
LEFT OUTER JOIN table(PK_AUTO_ACTS.get_fackt_act(invoice.id
                                              ,date_start
                                              ,date_end
   ) ) act_fact on invoice.id = act_fact. invc_ks_id


как ни странно все тоже заработало.
Вопрос насколько правильно и можно ли это использовать (просто для меня синтаксис с джойнами наглядней (+))
...
Рейтинг: 0 / 0
19.10.2018, 06:40
    #39719648
Crazy_Wolf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join pipeline функция возвращает параметры через раз
Код: plsql
1.
) ) act_fact on invoice.id = 1=1


Fixed.
...
Рейтинг: 0 / 0
19.10.2018, 07:43
    #39719655
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join pipeline функция возвращает параметры через раз
Crazy_Wolfпросто для меня синтаксис с джойнами наглядней (+)Чудило. Открой синтаксическую диаграмму table collection expression.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / left join pipeline функция возвращает параметры через раз / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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