Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 ORA-22905 - Как установить приоритет выполнения части запроса  [new]
HOME_X
Member

Откуда:
Сообщений: 2544
Доброго дня господа !

Запрос, работает с массивами = select * from table(select POS from TRN_LIST)
и пользов. типом pipelined функция
Реализован with - ми

если выполнять его в два этапа
- основной запрос RCC_KREDIT явно слить в таблицу
- к этой таблице подключить пользовательский тип
все в порядке

Если реализовать в один этап - ошибка = Ora-22905 cannot access rows from a non nested table item
Насколько понимаю поль. тип не может получить данных , их на момент вызова еще нет

Дополнения и пояснение
- With реализация для параметризирован. запроса
- TABLEDAY = параметр. дат
- TRN_LIST = набор констанат
- RCC_KREDIT это основной запрос, он делает сборку данных
для послед. передачи в функцию расчета (поль. тип ttRcc)

Вот надо как то сказать
- сначала полностью собери данные и сохрани их в времен. таблице (/*+ Materialize */)
- связь с типом ttRcc и расчет сделай "ПОПИСЖЕ".

Заранее благодарен !

with    TABLEDAY as (select 
                            Trunc(T.DREP,'MM') DBEG,
                            Last_Day(T.DREP)   DEND
                       from (select 
                                    To_Date('01-01-2017','DD-MM-YYYY') DREP
                               from DUAL
                            ) T        
                    ),
        TRN_LIST as (select 
                            Sys.OdciVarchar2List('CT2111','CT0040','CT0041','CT0042','CT0043','CT0047','CT0052','CT2011','CT2013','CT2031','CT2033','CT2113','CT2131','CT2133') ATM,
                            Sys.OdciVarchar2List('CT0044','CT0045','CT0047','CT0048','CT0049','CT0052','CT0053','CT0054','CT0065','CT0066','CT2021','CT2121') POS,
                            Sys.OdciVarchar2List(         'CT0040','CT0041','CT0042','CT0043') USB
                       from DUAL
                    ),   
      RCC_KREDIT as (select /*+ Materialize */
                            A.CEEIB_S_UA_DEAL                                             ID_CONTRACT_SAP,
                            Max(Nvl(G.ACTIVE,B.S_UA_DFRO))                                ACTIVE, 
                            Max('RCC')                                                    PROGRAM,
                            Max(D.TXTMD)                                                  NETWORK,
                            Max(B.SCHEMA)                                                 CREDIT_TYPE,
                            'ALL'                                                         TECHNOLOGY,
                            Sum(A.DEB_CRE_LC)                                             TOTAL_PRICE,
                            Round(Sum(Case when A.TB_TRNTYPE in(select * from table(select POS from TRN_LIST)) then 0
                                           when      Trunc(Months_Between(Nvl(G.ACTIVE,B.S_UA_DFRO),C.DBEG))=0 then F.OPENING_RATE1
                                           when A.TB_TRNTYPE in(select * from table(select USB from TRN_LIST)) then F.OPENING_RATE_UKRSIB       
                                                                                                               else F.OPENING_RATE_OTHER
                                      end * A.DEB_CRE_LC
                                     )
                                     /Sum(A.DEB_CRE_LC)
                                 ,8
                                 )                                                        OPENING_RATE,
                            0                                                             MONTHLY_RATE,
                            Round(Sum(Case when A.TB_TRNTYPE in(select * from table(select ATM from TRN_LIST)) then E.B0_NDUE/100 
                                                                                                               else E.B1_NDUE/100 
                                      end * A.DEB_CRE_LC
                                     )
                                     /Sum(A.DEB_CRE_LC)
                                 ,8
                                 )                                                        ACT_RATE,
                            Max(P.VALUE)                                                  FTP_RATE,     
                            Round(Sum(Greatest(E.B0_PMIN/100,0.00000001)*A.DEB_CRE_LC)/Sum(A.DEB_CRE_LC),8) MIN_RATE,     
                            Round(Sum(         F.COMIS_RKO        *A.DEB_CRE_LC)/Sum(A.DEB_CRE_LC),8) COMIS_RKO,  
                            Greatest(Max(Ceil(Months_Between(Add_Months(Nvl(G.ACTIVE,B.S_UA_DFRO),
                                                                        Case when Add_Months(Nvl(G.ACTIVE,B.S_UA_DFRO),24)<C.DBEG then 48 else 24 end
                                                                       )
                                                             ,C.DBEG
                                                            )-1 
                                             )
                                        )                   
                                    ,1
                                    )                                                     DURATION,       
                            Round(Sum(Case when A.TB_TRNTYPE in(select * from table(select ATM from TRN_LIST)) then F.GRACE 
                                                                                                               else       0 
                                      end * A.DEB_CRE_LC
                                     )
                                     /Sum(A.DEB_CRE_LC)
                                 ,8
                                 ) GRACE
                       from ADBUS.V_CFA_PAYM A
                       left join ADBUS.V_CFA_CTX_DEAL B                                             
                         on (B.CEEIB_S_UA_DEAL=A.CEEIB_S_UA_DEAL)
                       left join ADBUS.V_CFA_CTX_DIC_CARD_PRODUCT D
                         on (D.CTX_CRPR=B.CARD_PRODUCT)
                       left join ADBUS.V_CFA_CTX_SCHEME E 
                         on (    'CRTX\'||E.CTX_PROF||'\'||E.CRTX_SCH=B.SCHEMA
                             and A.PSTNG_DATE between E.DATE_FROM and E.DATE_TO
                            )
                       left join PF_REPORT.PM_CFA_CARD_PRODUCT F
                         on (    F.CARD_PRODUCT=B.CARD_PRODUCT
                             and A.PSTNG_DATE between F.DATE_FROM and F.DATE_TO
                            )
                       left join (select ACC_NUMBER  ID_CONTRACT_SAP,
                                         Min(DATE_FROM) ACTIVE
                                    from ADBUS.V_CFA_CTX_CARD
                                   where CARD_STATUS='CHST0'
                                   group by ACC_NUMBER
                                 ) G
                         on (G.ID_CONTRACT_SAP=Ltrim(A.CEEIB_S_UA_DEAL,'CTX'))
                       left join PM_FTP P
                         on (    P.DAY =Last_Day(Nvl(G.ACTIVE,B.S_UA_DFRO))
                             and P.KIND='bullet'
                             and P.RATE=0.0
                             and P.SPAN=24
                            ),
                            TABLEDAY C
                      where A.PSTNG_DATE between C.DBEG and C.DEND
                        and A.CEEIB_S_UA_DEAL like 'CTX2625%'
                        and A.TB_TRNTYPE in(select * 
                                              from table(select ATM from TRN_LIST)
                                             union all
                                            select * 
                                              from table(select POS from TRN_LIST)               
                                           )
                        and A.ACCDEBCRED='D'
                      group by
                            A.CEEIB_S_UA_DEAL
                    )
select A.*
  from (select C.*
          from (select /*+ No_Merge */
                       b.id_contract_sap,
                       b.program,
                       b.network,
                       b.credit_type,
                       b.technology,
                       b.TOTAL_PRICE,
                       b.OPENING_RATE,
                       b.monthly_rate,
                       b.act_rate,
                       b.ftp_rate,
                       b.min_rate,
                       b.comis_rko,
                       b.DURATION,
                       b.grace,
                       null MODES
                  from RCC_KREDIT b
               ) C
       ) A,
       table(ttRcc(A.id_contract_sap, 
                   A.program,
                   A.network,
                   A.credit_type,
                   A.technology,
                   A.total_price,
                   A.opening_rate,
                   A.monthly_rate,
                   A.act_rate,
                   A.ftp_rate,
                   A.min_rate,
                   A.comis_rko,
                   A.duration,
                   A.grace,
                   A.modes 
                  ).Show()
            ) T
26 фев 17, 16:46    [20244737]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22905 - Как установить приоритет выполнения части запроса  [new]
Чехов
Guest
упрости свою простыню с пятнами, смотреть тошно
26 фев 17, 17:31    [20244828]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22905 - Как установить приоритет выполнения части запроса  [new]
HOME_X
Member

Откуда:
Сообщений: 2544
Чехов,
Верю ... тогда пояснить еще сложнее

Не понимает синтаксиса вложенного запроса
Ошибка =Case when B_TRNTYPE in(select * from table(select POS from TRN_LIST))
Нормально=Case when TB_TRNTYPE in('CT2111','CT0040','CT0041','CT0042','CT0043','CT0047','CT0052')

Чем можно заменить ?
With TRN_LIST - хотелось бы оставить, реляцию создавать не хотелось бы (в смысле не сносить во FROM)
26 фев 17, 18:04    [20244902]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22905 - Как установить приоритет выполнения части запроса  [new]
HOME_X
Member

Откуда:
Сообщений: 2544
HOME_X,

Т.е. непонимает именно ссылку на таблицу, неважно какую

............Case when A.TB_TRNTYPE in (select 'DDD' from DUAL).......
26 фев 17, 18:17    [20244930]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22905 - Как установить приоритет выполнения части запроса  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
HOME_X,
типа если 1 раз обьявить то потом проще получать первый и последний день? это как ронять себе на ногу гирю и смотреть на результат
select 
                            Trunc(T.DREP,'MM') DBEG,
                            Last_Day(T.DREP)   DEND
                       from (select 
                                    To_Date('01-01-2017','DD-MM-YYYY') DREP
                               from DUAL
                            ) T 


обьявить таблицу из 1 строки чтобы запихнуть в три столбца три массива... три таблички тебя чем не устроили?
select 
                            Sys.OdciVarchar2List('CT2111','CT0040','CT0041','CT0042','CT0043','CT0047','CT0052','CT2011','CT2013','CT2031','CT2033','CT2113','CT2131','CT2133') ATM,
                            Sys.OdciVarchar2List('CT0044','CT0045','CT0047','CT0048','CT0049','CT0052','CT0053','CT0054','CT0065','CT0066','CT2021','CT2121') POS,
                            Sys.OdciVarchar2List(         'CT0040','CT0041','CT0042','CT0043') USB
                       from DUAL

а так писать надо чтобы никто не догадался?
(select C.*
          from (select /*+ No_Merge */
                       b.id_contract_sap,
                       b.program,
                       b.network,
                       b.credit_type,
                       b.technology,
                       b.TOTAL_PRICE,
                       b.OPENING_RATE,
                       b.monthly_rate,
                       b.act_rate,
                       b.ftp_rate,
                       b.min_rate,
                       b.comis_rko,
                       b.DURATION,
                       b.grace,
                       null MODES
                  from RCC_KREDIT b
               ) C
       ) A,

или тебе платят построчно? и зачем тебе таблица Т если ты все равно делаешь select A.*

идиотизм не лечиться. ты же не проограмист.. ты говнокодер. помогать и что-то обьяснять можно если человек хоть как то следит за кодом. а в дерьме копаться за бесплатно - увольте.
26 фев 17, 19:43    [20245048]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22905 - Как установить приоритет выполнения части запроса  [new]
Elic
Member

Откуда:
Сообщений: 29980
HOME_X
Т.е. непонимает именно ссылку на таблицу, неважно какую

............Case when A.TB_TRNTYPE in (select 'DDD' from DUAL)......
Врёшь. Ты просто не умеешь декомпозировать, а лишь владеешь ремеслом быдло-копи-паста.
Если бы владел упрощением, то смог бы и сам в процессе понять, где лопух, не вынося сор на форум.
26 фев 17, 19:54    [20245070]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22905 - Как установить приоритет выполнения части запроса  [new]
HOME_X
Member

Откуда:
Сообщений: 2544
Vint
HOME_X,
типа если 1 раз обьявить то потом проще получать первый и последний день? это как ронять себе на ногу гирю и смотреть на результат

Все параметрические переменные - сносятся в первые строки кода.
Так читабельнее и удобнее при изменении, не надо шарить по полному листингу кода
Этот with параметризирует временной период могут использоваться во многократно


Vint
обьявить таблицу из 1 строки чтобы запихнуть в три столбца три массива... три таблички тебя чем не устроили?

Где Вы намерены хранить эти три таблички ? В базе ? Зачем ?
Они не являются глобальными данными и используются исключительно для одного отчета
Эти константы классифицированы фунционал. и компактно записаны одной строкой и тремя полями
Чем не нравиться такая запись ? Oracle такое понимает .... (всегда ли это вопрос ?)
Это with параметризирует локальные константы, дает возможность их менять в одном месте

Два with можно совместить.... , об этом после

Vint
а так писать надо чтобы никто не догадался?


Это уже практиковал (комбинировал) код после возникновения ошибки в ПРОДУКТИВЕ выглядит так
Где псевдоним А(В) - это запрос по сборке исходных данных
T - тип который отвечает за расчет

/*
select T.*
from (select /*+ No_Merge * /
b.id_contract_sap,
b.program,
b.network,
..............
b.DURATION,
b.grace,
Cast(null as Varchar2(10)) MODES
from RCC_KREDIT b
) A,
table(ttRcc(A.id_contract_sap,
A.program,
..................
) T
*/

Так понятно ?
26 фев 17, 20:42    [20245145]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22905 - Как установить приоритет выполнения части запроса  [new]
HOME_X
Member

Откуда:
Сообщений: 2544
Elic
HOME_X
Т.е. непонимает именно ссылку на таблицу, неважно какую

............Case when A.TB_TRNTYPE in (select 'DDD' from DUAL)......
Врёшь. Ты просто не умеешь декомпозировать, а лишь владеешь ремеслом быдло-копи-паста.
Если бы владел упрощением, то смог бы и сам в процессе понять, где лопух, не вынося сор на форум.



Первоначальный вопрос звучал так

- основной запрос RCC_KREDIT работает нормально, со всеми with и массивами
(если запустить его отдельно)
- подвязываем поль. тип ttRcc - получаем ошибку

- если слить основной запрос RCC_KREDIT ЯВНО в таблицу
- подвязываем поль. тип - НЕ получаем ошибку !!!

Отсюда первая попытка решить проблемы

Сначала заставить базу выполнить сборку данных RCC - материализовать результат
далее вторым этапом связать
Как это сделать - пожалуйста четко и конкретно ?


Второе решение попытаться переписать ПОПОНЯТНЕЕ основной код = RCC_KREDIT

Как искать в массиве, умею так

select ..............
Case when A.TB_TRNTYPE in (select * from table(H.ATM)) then ................
from ....... A,
TRN_LIST H -- здесь всегда одна запись

Есть еще варианты - уточните на примере..

Делать множественную реляцию не интересно


Заранее благодарен !
26 фев 17, 21:13    [20245208]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22905 - Как установить приоритет выполнения части запроса  [new]
Elic
Member

Откуда:
Сообщений: 29980
HOME_X
Отсюда первая попытка решить проблемы
Метод тыка.
HOME_X
Как это сделать - пожалуйста четко и конкретно ?
уточните на примере
Наивность вкупе с наглостью?
Но совет дам. Твоя портянка только годится только для (не)печати на мягкой бумаге.
HOME_X
Делать множественную реляцию не интересно
Гадать на гуще версий - тоже.
26 фев 17, 22:06    [20245306]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22905 - Как установить приоритет выполнения части запроса  [new]
HOME_X
Member

Откуда:
Сообщений: 2544
Elic
HOME_X
Отсюда первая попытка решить проблемы
Метод тыка.
HOME_X
Как это сделать - пожалуйста четко и конкретно ?
уточните на примере
Наивность вкупе с наглостью?
Но совет дам. Твоя портянка только годится только для (не)печати на мягкой бумаге.
HOME_X
Делать множественную реляцию не интересно
Гадать на гуще версий - тоже.



Если Вы знаете Все настолько хорошо что Вам не любопытно
Зачем тратить СВОЕ и ЧУЖОЕ время, натирать мозоли и гадить сервер столь содержательными постами.....?


P.S. Всего доброго ...
26 фев 17, 23:02    [20245447]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22905 - Как установить приоритет выполнения части запроса  [new]
Elic
Member

Откуда:
Сообщений: 29980
HOME_X
гадить сервер столь содержательными постами.....?
Ты слишком высокого мнения о своём содержании.
HOME_X
P.S. Всего доброго ...
Кто хочет видеть личного, тот видит только его.
26 фев 17, 23:07    [20245451]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22905 - Как установить приоритет выполнения части запроса  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
HOME_X
Чехов,
Верю ... тогда пояснить еще сложнее

Не понимает синтаксиса вложенного запроса
Ошибка =Case when B_TRNTYPE in(select * from table(select POS from TRN_LIST))
Нормально=Case when TB_TRNTYPE in('CT2111','CT0040','CT0041','CT0042','CT0043','CT0047','CT0052')

Чем можно заменить ?
With TRN_LIST - хотелось бы оставить, реляцию создавать не хотелось бы (в смысле не сносить во FROM)
Что именно не понимает то?
SQL> with
  2          TRN_LIST as (select
  3                              Sys.ku$_vcnt('CT2111','CT0040','CT0041','CT0042','CT0043','CT0047','CT0052','CT2011','CT2013','CT2031','CT2033','CT2113','CT2131','CT2133
') ATM,
  4                              Sys.ku$_vcnt('CT0044','CT0045','CT0047','CT0048','CT0049','CT0052','CT0053','CT0054','CT0065','CT0066','CT2021','CT2121') POS,
  5                              Sys.ku$_vcnt(         'CT0040','CT0041','CT0042','CT0043') USB
  6                         from DUAL
  7                      )
  8  , test_data as
  9  (
 10  select 'CT2111' value from dual
 11  union all select 'CT9999' value from dual
 12  )
 13  select test_data.*
 14  from test_data
 15  where value in (select * from table(select atm from TRN_LIST));

VALUE
------
CT2111

Как альтернатива, можно еще
1) либо unnest коллекции
SQL> with
  2          TRN_LIST as (select
  3                              Sys.ku$_vcnt('CT2111','CT0040','CT0041','CT0042','CT0043','CT0047','CT0052','CT2011','CT2013','CT2031','CT2033','CT2113','CT2131','CT2133
') ATM,
  4                              Sys.ku$_vcnt('CT0044','CT0045','CT0047','CT0048','CT0049','CT0052','CT0053','CT0054','CT0065','CT0066','CT2021','CT2121') POS,
  5                              Sys.ku$_vcnt(         'CT0040','CT0041','CT0042','CT0043') USB
  6                         from DUAL
  7                      )
  8  , test_data as
  9  (
 10  select 'CT2111' value from dual
 11  union all select 'CT9999' value from dual
 12  )
 13  select test_data.*
 14  from test_data
 15  where value in (select value(t) atm from TRN_LIST, table(atm) t);

VALUE
------
CT2111

2) либо воспользоваться условием member of
SQL> with
  2          TRN_LIST as (select
  3                              Sys.ku$_vcnt('CT2111','CT0040','CT0041','CT0042','CT0043','CT0047','CT0052','CT2011','CT2013','CT2031','CT2033','CT2113','CT2131','CT2133
') ATM,
  4                              Sys.ku$_vcnt('CT0044','CT0045','CT0047','CT0048','CT0049','CT0052','CT0053','CT0054','CT0065','CT0066','CT2021','CT2121') POS,
  5                              Sys.ku$_vcnt(         'CT0040','CT0041','CT0042','CT0043') USB
  6                         from DUAL
  7                      )
  8  , test_data as
  9  (
 10  select 'CT2111' value from dual
 11  union all select 'CT9999' value from dual
 12  )
 13  select test_data.*
 14  from test_data
 15  cross join trn_list
 16  where value member of trn_list.atm;

VALUE
------
CT2111


Это была теоретическая часть. Фактически, я бы не рекомендовал применять этот инструментарий, не понимая как он работает и для чего предназначен.
Ты можешь столкнуться с массой проблем начиная от ненужного использования CPU, неверной оценки кардинальности и кривых планов и заканчивая тем, что невозможно будет использовать параллельное выполнение запроса из-за примененных не к месту коллекций.

PS. Не знаю чего все так накинулись, но в следующий раз потрать еще немного времени чтоб выпилить лишнее.
Видно что ты пытался что-то сделать, но подобные полотна вызывают раздражение.
И по прежнему до конца не ясно, что у тебя не взлетело.
27 фев 17, 01:40    [20245605]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22905 - Как установить приоритет выполнения части запроса  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
HOME_X,
+ сколько работает? если нет пробуй проставить кардиналити у коллекций.
WITH TABLEDAY AS
 (SELECT Trunc((date '2017-01-01'), 'MM') DBEG, Last_Day(date '2017-01-01') DEND FROM DUAL),
atm AS
 (SELECT column_value tmp
    FROM TABLE(Sys.OdciVarchar2List('CT2111'
                                   ,'CT0040'
                                   ,'CT0041'
                                   ,'CT0042'
                                   ,'CT0043'
                                   ,'CT0047'
                                   ,'CT0052'
                                   ,'CT2011'
                                   ,'CT2013'
                                   ,'CT2031'
                                   ,'CT2033'
                                   ,'CT2113'
                                   ,'CT2131'
                                   ,'CT2133'))),
atm AS
 (SELECT column_value tmp FROM TABLE(Sys.OdciVarchar2List('CT0040', 'CT0041', 'CT0042', 'CT0043'))),
pos AS
 (SELECT column_value tmp
    FROM TABLE(Sys.OdciVarchar2List('CT0044'
                                   ,'CT0045'
                                   ,'CT0047'
                                   ,'CT0048'
                                   ,'CT0049'
                                   ,'CT0052'
                                   ,'CT0053'
                                   ,'CT0054'
                                   ,'CT0065'
                                   ,'CT0066'
                                   ,'CT2021'
                                   ,'CT2121')))
,
RCC_KREDIT AS
 (SELECT /*+ Materialize */
   A.CEEIB_S_UA_DEAL ID_CONTRACT_SAP
  ,MAX(Nvl(G.ACTIVE, B.S_UA_DFRO)) ACTIVE
  ,MAX('RCC') PROGRAM
  ,MAX(D.TXTMD) NETWORK
  ,MAX(B.SCHEMA) CREDIT_TYPE
  ,'ALL' TECHNOLOGY
  ,SUM(A.DEB_CRE_LC) TOTAL_PRICE
  ,Round(SUM(CASE
               WHEN A.TB_TRNTYPE IN (SELECT tmp FROM pos) THEN
                0
               WHEN Trunc(Months_Between(Nvl(G.ACTIVE, B.S_UA_DFRO), C.DBEG)) = 0 THEN
                F.OPENING_RATE1
               WHEN A.TB_TRNTYPE IN (SELECT tmp FROM USB) THEN
                F.OPENING_RATE_UKRSIB
               ELSE
                F.OPENING_RATE_OTHER
             END * A.DEB_CRE_LC) / SUM(A.DEB_CRE_LC)
        ,8) OPENING_RATE
  ,0 MONTHLY_RATE
  ,Round(SUM(CASE
               WHEN A.TB_TRNTYPE IN (SELECT tmp FROM ATM) THEN
                E.B0_NDUE / 100
               ELSE
                E.B1_NDUE / 100
             END * A.DEB_CRE_LC) / SUM(A.DEB_CRE_LC)
        ,8) ACT_RATE
  ,MAX(P.VALUE) FTP_RATE
  ,Round(SUM(Greatest(E.B0_PMIN / 100, 0.00000001) * A.DEB_CRE_LC) / SUM(A.DEB_CRE_LC), 8) MIN_RATE
  ,Round(SUM(F.COMIS_RKO * A.DEB_CRE_LC) / SUM(A.DEB_CRE_LC), 8) COMIS_RKO
  ,Greatest(MAX(Ceil(Months_Between(Add_Months(Nvl(G.ACTIVE, B.S_UA_DFRO)
                                              ,CASE
                                                 WHEN Add_Months(Nvl(G.ACTIVE, B.S_UA_DFRO), 24) < C.DBEG THEN
                                                  48
                                                 ELSE
                                                  24
                                               END)
                                   ,C.DBEG) - 1))
           ,1) DURATION
  ,Round(SUM(CASE
               WHEN A.TB_TRNTYPE IN (SELECT tmp FROM ATM) THEN
                F.GRACE
               ELSE
                0
             END * A.DEB_CRE_LC) / SUM(A.DEB_CRE_LC)
        ,8) GRACE
    FROM ADBUS.V_CFA_PAYM A
    LEFT JOIN ADBUS.V_CFA_CTX_DEAL B
      ON (B.CEEIB_S_UA_DEAL = A.CEEIB_S_UA_DEAL)
    LEFT JOIN ADBUS.V_CFA_CTX_DIC_CARD_PRODUCT D
      ON (D.CTX_CRPR = B.CARD_PRODUCT)
    LEFT JOIN ADBUS.V_CFA_CTX_SCHEME E
      ON ('CRTX\' || E.CTX_PROF || '\' || E.CRTX_SCH = B.SCHEMA AND A.PSTNG_DATE BETWEEN E.DATE_FROM AND E.DATE_TO)
    LEFT JOIN PF_REPORT.PM_CFA_CARD_PRODUCT F
      ON (F.CARD_PRODUCT = B.CARD_PRODUCT AND A.PSTNG_DATE BETWEEN F.DATE_FROM AND F.DATE_TO)
    LEFT JOIN (SELECT ACC_NUMBER ID_CONTRACT_SAP, MIN(DATE_FROM) ACTIVE FROM ADBUS.V_CFA_CTX_CARD WHERE CARD_STATUS = 'CHST0' GROUP BY ACC_NUMBER) G
      ON (G.ID_CONTRACT_SAP = Ltrim(A.CEEIB_S_UA_DEAL, 'CTX'))
    LEFT JOIN PM_FTP P
      ON (P.DAY = Last_Day(Nvl(G.ACTIVE, B.S_UA_DFRO)) AND P.KIND = 'bullet' AND P.RATE = 0.0 AND P.SPAN = 24), TABLEDAY C
   WHERE A.PSTNG_DATE BETWEEN C.DBEG AND C.DEND
     AND A.CEEIB_S_UA_DEAL LIKE 'CTX2625%'
     AND A.TB_TRNTYPE IN (SELECT tmp
                            FROM ATM
                          UNION ALL
                          SELECT tmp FROM POS)
     AND A.ACCDEBCRED = 'D'
   GROUP BY A.CEEIB_S_UA_DEAL)
SELECT b.id_contract_sap
      ,b.program
      ,b.network
      ,b.credit_type
      ,b.technology
      ,b.TOTAL_PRICE
      ,b.OPENING_RATE
      ,b.monthly_rate
      ,b.act_rate
      ,b.ftp_rate
      ,b.min_rate
      ,b.comis_rko
      ,b.DURATION
      ,b.grace
      ,NULL MODES
      ,t.*
  FROM RCC_KREDIT b
      ,TABLE(ttRcc(b.id_contract_sap, b.program, b.network, b.credit_type, b.technology, b.total_price, b.opening_rate, b.monthly_rate, b.act_rate, b.ftp_rate, b.min_rate, b.comis_rko, b.duration, b.grace, b.modes)
             .Show()) T
27 фев 17, 10:24    [20246174]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22905 - Как установить приоритет выполнения части запроса  [new]
HOME_X
Member

Откуда:
Сообщений: 2544
Извините господа - малость отсутствовал

Решение следующее

1. Простое и НЕВЕРНОЕ (как вариант возможен) - представить список в виде строки и осуществлять поиск через InStr
2. Правильное, искать в коллекции через member of - Case when A.TB_TRNTYPE member of C.ATM then ...........

3.Рекомендации Oracle о явном приведении типа не к чему не привело

22905, 00000, "cannot access rows from a non-nested table item"
// *Cause: attempt to access rows of an item whose type is not known at
// parse time or that is not of a nested table type
// *Action: use CAST to cast the item to a nested table type

Case when A.TB_TRNTYPE in (select * from table(cast(C.POS as Mdsys.SdorIdTab))) then F.GRACE else 0 end

4.Попытки упростить конструкцию запроса, оставить только структуру - ошибка ушла, но хотелось бы понять
ее причину (возможно в данных - поиграюсь при случае)

Но вариант два вполне приемлем - может кому пригодится

Спасибо за уделенное время и участие
20 мар 17, 18:23    [20315155]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить