У меня есть простой запрос, который дает мне ошибку
Ошибка (2713,12): PL / SQL: ORA-00907: отсутствует правая скобка
SELECT XMLAgg(Case When (Select xx_info_n26 From xxsample_table Where xx_info_v1 = 'H' and xx_info_v27 = 'AR' ) > 0 Then
(SELECT XMLAGG(XMLCONCAT(XMLElement("tns:SprzedazWiersz",
xmlelement("tns:LpSprzedazy" , rownum),
xmlelement("tns:KodKrajuNadaniaTIN", substr(ar_trx.tax_reg_num, 0, 2)),
xmlelement("tns:NrKontrahenta" , substr(ar_trx.tax_reg_num, 2)),
xmlelement("tns:NazwaKontrahenta" , ar_trx.cust_name),
xmlelement("tns:DowodSprzedazy" , ar_trx.trx_number),
xmlelement("tns:DataWystawienia" , TO_CHAR(ar_trx.invoice_date,'RRRR-MM-DD')),
Case When ar_trx.sales_date is not null Then xmlelement("tns:DataSprzedazy" , TO_CHAR(ar_trx.sales_date,'RRRR-MM-DD')) END,
-- DocumentType
(Select xmlelement("tns:TypDokumentu" , doctype.Document_type_code)
from (select distinct xx_info_n3 trx_id
, xx_info_v15 Document_type_code
From xxsample_table
Where xx_info_v1 = 'AR'
and xx_info_v16 = 'ORA_JEPL_DOCUMENT_TYPE') doctype
where doctype.trx_id = ar_trx.trx_id),
-- Transaction Attributes
(Select xmlagg(xmlconcat(xmlelement(evalname(trdattr.TRANSACTION_ATTRIBUTE_CODE), 1)))
From ( Select distinct xx_info_v12 TRANSACTION_ATTRIBUTE_CODE
From xxsample_table
Where xx_info_V1 = 'AR'
and xx_info_v12 <> 'tns:'
and xx_info_n3 = ar_trx.trx_id
UNION ALL
Select xx_info_v20 TRANSACTION_ATTRIBUTE_CODE
From xxsample_table
Where xx_info_V1 = 'AR'
and xx_info_n3 = ar_trx.trx_id
and xx_info_v20 <> 0) trdattr
order by
case TRANSACTION_ATTRIBUTE_CODE
when 'tns:SW' then 1
when 'tns:EE' THEN 2
when 'tns:TP' THEN 3
when 'tns:TT_WNT' then 4
when 'tns:TT_D' THEN 5
when 'tns:MR_T' THEN 6
when 'tns:MR_UZ' THEN 7
when 'tns:I_42' THEN 8
when 'tns:I_63' THEN 9
when 'tns:B_SPV' THEN 10
when 'tns:B_SPV_DOSTAWA' THEN 11
when 'tns:B_MPV_PROWIZJA' THEN 12
when 'tns:MPP' THEN 13
ELSE 14 END)
,
-- Kboxes
(Select xmlagg(xmlconcat(xmlelement(evalname(ar_tax_sum.box),ar_tax_sum.amount)))
From ( select box
, sum(amount) amount
from (Select xx_info_v5 box
, Sum(xx_info_n1) amount
From xxsample_table
Where xx_info_V1 = 'AR'
and xx_info_n3 = ar_trx.trx_id
Group By xx_info_v5
UNION
Select xx_info_v6 box
, Sum(xx_info_n2) amount
From xxsample_table
Where xx_info_V1 = 'AR'
and xx_info_n3 = ar_trx.trx_id
Group By xx_info_v6)
Where box <> 'tns:'
group by box) ar_tax_sum
)
))
)
From ( Select distinct xx_info_n3 trx_id
, xx_info_v2 trx_number
, xx_info_d1 sales_date
, xx_info_d3 invoice_date
, xx_info_v3 cust_name
, xx_info_v17 cust_addr
, xx_info_v7 tax_reg_num
From xxsample_table
Where xx_info_v1 = 'AR'
Order by 3,4
) ar_trx
) End)
FROM DUAL)
Я думаю, что эта ошибка вызвана условным ORDER BY
, потому что, когда я полностью удаляю ORDER BY
(строки 31-46), запрос работает нормально. Тем не менее, я не понимаю, почему это может вызвать ошибку, когда я могу выполнить отдельный подзапрос самостоятельно:
Select xmlagg(xmlconcat(xmlelement(evalname(trdattr.TRANSACTION_ATTRIBUTE_CODE), 1)))
From ( Select distinct xx_info_v12 TRANSACTION_ATTRIBUTE_CODE
From xxsample_table
Where xx_info_V1 = 'AR'
and xx_info_v12 <> 'tns:'
--and xx_info_n3 = ar_trx.trx_id
UNION ALL
Select xx_info_v20 TRANSACTION_ATTRIBUTE_CODE
From xxsample_table
Where xx_info_V1 = 'AR'
--and xx_info_n3 = ar_trx.trx_id
and xx_info_v20 <> 0) trdattr
order by
case TRANSACTION_ATTRIBUTE_CODE
when 'tns:SW' then 1
when 'tns:EE' THEN 2
when 'tns:TP' THEN 3
when 'tns:TT_WNT' then 4
when 'tns:TT_D' THEN 5
when 'tns:MR_T' THEN 6
when 'tns:MR_UZ' THEN 7
when 'tns:I_42' THEN 8
when 'tns:I_63' THEN 9
when 'tns:B_SPV' THEN 10
when 'tns:B_SPV_DOSTAWA' THEN 11
when 'tns:B_MPV_PROWIZJA' THEN 12
when 'tns:MPP' THEN 13
ELSE 14 END
Я также попробовал просто обычный ORDER BY
, и он все еще дает мне ошибка.
Я попытался переместить ORDER BY
в самый внутренний запрос trdattr
, и он как-то работает. Однако при повторном добавлении оператора CASE
появляется следующая ошибка:
ORA-01785: элемент ORDER BY должен быть номером выражения списка SELECT
Как правильно включить условное ORDER BY
в основной запрос?