У меня есть фрагмент кода ниже, который генерирует файл XML, и он отлично работает:
SELECT XMLAGG(XMLELEMENT("tns:Podmiot1",
(SELECT xmlconcat(XMLELEMENT("tns:IdentyfikatorPodmiotu",
XMLELEMENT("etd:NIP", regexp_replace(jgzzvtg.jg_info_v7, '[^0-9]+', '')),
XMLELEMENT("etd:PelnaNazwa", jgzzvtg.jg_info_v8))
, XMLELEMENT("tns:AdresPodmiotu",
XMLELEMENT("etd:KodKraju", jgzzvtg.jg_info_v10),
XMLELEMENT("etd:Wojewodztwo", jgzzvtg.jg_info_v11),
XMLELEMENT("etd:Powiat", jgzzvtg.jg_info_v12),
XMLELEMENT("etd:Gmina", jgzzvtg.jg_info_v13),
XMLELEMENT("etd:Ulica", jgzzvtg.jg_info_v14),
XMLELEMENT("etd:NrDomu", jgzzvtg.jg_info_v15),
CASE WHEN jgzzvtg.jg_info_v16 IS NOT NULL THEN XMLELEMENT("etd:NrLokalu", jgzzvtg.jg_info_v16) END, --modified for bug 28298307
XMLELEMENT("etd:Miejscowosc", jgzzvtg.jg_info_v17),
XMLELEMENT("etd:KodPocztowy", jgzzvtg.jg_info_v18)))
FROM jg_zz_vat_trx_gt jgzzvtg
WHERE jgzzvtg.jg_info_v1 = 'H')))
FROM dual;
Однако мне необходимо добавить быструю логику c к тегу tns:AdresPodmiotu
. он должен отображаться как tns:AdresPodmiotu2
, если значение jgzzvtg.jg_info_v10
не равно «PL». Приведенный ниже фрагмент кода работает нормально:
SELECT XMLAGG(XMLELEMENT("tns:Podmiot1",
(SELECT xmlconcat(XMLELEMENT("tns:IdentyfikatorPodmiotu",
XMLELEMENT("etd:NIP", regexp_replace(jgzzvtg.jg_info_v7, '[^0-9]+', '')),
XMLELEMENT("etd:PelnaNazwa", jgzzvtg.jg_info_v8)),
(CASE WHEN jgzzvtg.jg_info_v10 = 'PL' then XMLELEMENT ("tns:AdresPodmiotu",
XMLELEMENT ( "etd:KodKraju" , jgzzvtg.jg_info_v10) ,
XMLELEMENT ( "etd:Wojewodztwo" , jgzzvtg.jg_info_v11),
XMLELEMENT ( "etd:Powiat" , jgzzvtg.jg_info_v12),
XMLELEMENT ( "etd:Gmina" , jgzzvtg.jg_info_v13) ,
XMLELEMENT ( "etd:Ulica" , jgzzvtg.jg_info_v14),
XMLELEMENT ( "etd:NrDomu" , jgzzvtg.jg_info_v15),
Case When jgzzvtg.jg_info_v16 is not null Then XMLELEMENT ( "etd:NrLokalu" , jgzzvtg.jg_info_v16) End, --modified for bug 28298307
XMLELEMENT ( "etd:Miejscowosc" , jgzzvtg.jg_info_v17),
XMLELEMENT ( "etd:KodPocztowy" , jgzzvtg.jg_info_v18)
)
else XMLELEMENT ("tns:AdresPodmiotu2",
XMLELEMENT ( "etd:KodKraju" , jgzzvtg.jg_info_v10) ,
XMLELEMENT ( "etd:Wojewodztwo" , jgzzvtg.jg_info_v11),
XMLELEMENT ( "etd:Powiat" , jgzzvtg.jg_info_v12),
XMLELEMENT ( "etd:Gmina" , jgzzvtg.jg_info_v13) ,
XMLELEMENT ( "etd:Ulica" , jgzzvtg.jg_info_v14),
XMLELEMENT ( "etd:NrDomu" , jgzzvtg.jg_info_v15),
Case When jgzzvtg.jg_info_v16 is not null Then XMLELEMENT ( "etd:NrLokalu" , jgzzvtg.jg_info_v16) End, --modified for bug 28298307
XMLELEMENT ( "etd:Miejscowosc" , jgzzvtg.jg_info_v17),
XMLELEMENT ( "etd:KodPocztowy" , jgzzvtg.jg_info_v18)
) end))
FROM jg_zz_vat_trx_gt jgzzvtg
WHERE jgzzvtg.jg_info_v1 = 'H')))
FROM dual;
Однако я хотел сделать его немного короче, поскольку единственное, что действительно изменится, это tns:AdresPodmiotu
на tns:AdresPodmiotu2
, я попытался выполнить следующий запрос , но, похоже, не работает:
SELECT XMLAGG(XMLELEMENT("tns:Podmiot1",
(SELECT xmlconcat(XMLELEMENT("tns:IdentyfikatorPodmiotu",
XMLELEMENT("etd:NIP", regexp_replace(jgzzvtg.jg_info_v7, '[^0-9]+', '')),
XMLELEMENT("etd:PelnaNazwa", jgzzvtg.jg_info_v8))
, XMLELEMENT( (case when jgzzvtg.jg_info_v10 = 'PL' then "tns:AdresPodmiotu" else "tns:AdresPodmiotu2" end) ,
XMLELEMENT("etd:KodKraju", jgzzvtg.jg_info_v10),
XMLELEMENT("etd:Wojewodztwo", jgzzvtg.jg_info_v11),
XMLELEMENT("etd:Powiat", jgzzvtg.jg_info_v12),
XMLELEMENT("etd:Gmina", jgzzvtg.jg_info_v13),
XMLELEMENT("etd:Ulica", jgzzvtg.jg_info_v14),
XMLELEMENT("etd:NrDomu", jgzzvtg.jg_info_v15),
CASE WHEN jgzzvtg.jg_info_v16 IS NOT NULL THEN XMLELEMENT("etd:NrLokalu", jgzzvtg.jg_info_v16) END, --modified for bug 28298307
XMLELEMENT("etd:Miejscowosc", jgzzvtg.jg_info_v17),
XMLELEMENT("etd:KodPocztowy", jgzzvtg.jg_info_v18)))
FROM jg_zz_vat_trx_gt jgzzvtg
WHERE jgzzvtg.jg_info_v1 = 'H')))
FROM dual;
Это дает мне ошибку ORA-00931: missing identifier
. Есть ли другой способ, которым я могу написать этот кусок кода кратчайшим путем?
Спасибо!