ORA-00931: отсутствует идентификатор при использовании CASE в функции XMLELEMENT - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть фрагмент кода ниже, который генерирует файл 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. Есть ли другой способ, которым я могу написать этот кусок кода кратчайшим путем?

Спасибо!

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Проблематичная c часть вашего ошибочного запроса выглядит следующим образом:

XMLELEMENT( (case when jgzzvtg.jg_info_v10 = 'PL' then "tns:AdresPodmiotu" else "tns:AdresPodmiotu2" end)
    -- ...
)

Вы можете указать имя элемента в XMLELEMENT, указав идентификатор, как вы делаете в своем рабочие запросы или как EVALNAME с последующим выражением. Вам нужно использовать последнее, поэтому попробуйте следующее:

XMLELEMENT(EVALNAME (case when jgzzvtg.jg_info_v10 = 'PL' then 'tns:AdresPodmiotu' else 'tns:AdresPodmiotu2' end)
    -- ...
)

Обратите внимание, что я изменил tns:AdresPodmiotu и tns:AdresPodmiotu2 на строки в одинарных кавычках.

0 голосов
/ 07 апреля 2020

Мне удалось найти решение для этого, заключив его в другой оператор SELECT FROM DUAL, а затем используя EVALNAME, чтобы получить тег:

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) ,  -- this is the old code
                                    , XMLELEMENT( evalname(select case when jgzzvtg.jg_info_v10 = 'PL' then 'tns:AdresPodmiotu' else 'tns:AdresPodmiotu2' end 
                                                           from   dual),                                                
                                                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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...