Как удалить узел (тег) из сгустка XML - PullRequest
0 голосов
/ 19 апреля 2019

Я написал скрипт PL / SQL (Oracle), который генерирует данные XML; в настоящее время данные XML записываются в DBMS_output. У меня есть подзапрос XMLAGG, который производит нежелательный тег, и я проверяю, есть ли способ удалить тег, прежде чем выводить результаты.

Я пытался использовать DELETEXML и DELETE NODE, но я впервые получаю ошибки при тестировании; Я знаю, что это кодирование ошибок пользователя.

Вот что я написал:

declare
    c_xmltype xmltype;
    f_xmltype xmltype;
    c_ctx dbms_xmlgen.ctxhandle;

procedure print_clob(p_clob in clob) is
    v_offset number :=1;
    v_chunk_size number :=11000;
begin
    loop
        exit when v_offset > dbms_lob.getlength(p_clob);
        dbms_output.put_line(dbms_lob.substr(p_clob, v_chunk_size, v_offset));
        v_offset := v_offset + v_chunk_size;
    end loop;
end print_clob;

begin
    dbms_output.enable(null);
    c_ctx := dbms_xmlgen.newcontext('select
                                     a.id as id_number
                                     , (select xmlagg(
                                        xmlelement("DETAIL",
                                        xmlforest(
                                                   b.line_number as line_number
                                                  ,to_char(b.from_date, ''MM/DD/YYYY'') as begin_date
                                                  ,to_char(b.to_date, ''MM/DD/YYYY'') as end_date
                                                  ,b.r_code as reason_code
                                                  ,'''' as reason_code_2
                                                  ,'''' as ndc_code
                                                  ,''1'' as match_method
                                                  ,''01'' as unit_type
                                                  ,b.quantity as units
                                                  ,'''' as auth_class
                                                  ,'''' as auth_class_use
                                                  ,'''' as authorization_level
                                                  ,''D'' as status
                                                  ,''D58'' as status_reason
                                                  , 999902 as user_id
                                                  ,to_char(sysdate, ''MM/DD/YYYY'') as date_timestamp
                                                 )
                                        ))
                                        from table_b b
                                        inner join table_c c
                                        on c.id = b.id
                                        and c.line_number = b.line_number
                                        where b.claim_id = a.claim_id
                                        ) as remove_tag

                                     from table_a a

                                     where
                                     a.id = ''100''

                                     order by a.id
                                     '
                                    );

    dbms_xmlgen.setnullhandling(c_ctx, dbms_xmlgen.empty_tag);
    dbms_xmlgen.setrowsettag(c_ctx, 'AUTHORIZATIONS');
    dbms_xmlgen.setrowtag(c_ctx, 'AUTHORIZATION');

    c_xmltype := dbms_xmlgen.getxmltype(c_ctx);
    dbms_xmlgen.closecontext(c_ctx);

    print_clob(c_xmltype.getclobval);

end;

На выходе получается:

<AUTHORIZATIONS>
 <AUTHORIZATION>
  <ID>100</ID>
  <REMOVE_TAG>
            <AUTHORIZATION_SERVICES>
                <LINE_NUMBER>1</LINE_NUMBER>
                <BEGIN_DATE>01/14/2019</BEGIN_DATE>
                <END_DATE>01/14/2019</END_DATE>
                <REASON_CODE>99213</REASON_CODE>
                <REASON_CODE_2/>
                <NDC_CODE/>
                <MATCH_METHOD>1</MATCH_METHOD>
                <UNIT_TYPE>01</UNIT_TYPE>
                <UNITS>1</UNITS>
                <AUTH_CLASS/>
                <AUTH_CLASS_USE/>
                <AUTHORIZATION_LEVEL/>
                <STATUS>D</STATUS>
                <STATUS_REASON>D58</STATUS_REASON>
                <USER_ID>999902</USER_ID>
                <DATE_TIMESTAMP>04/18/2019</DATE_TIMESTAMP>
            </AUTHORIZATION_SERVICES>
            <AUTHORIZATION_SERVICES>
                <LINE_NUMBER>2</LINE_NUMBER>
                <BEGIN_DATE>01/14/2019</BEGIN_DATE>
                <END_DATE>01/14/2019</END_DATE>
                <REASON_CODE>17110</REASON_CODE>
                <REASON_CODE_2/>
                <NDC_CODE/>
                <MATCH_METHOD>1</MATCH_METHOD>
                <UNIT_TYPE>01</UNIT_TYPE>
                <UNITS>1</UNITS>
                <AUTH_CLASS/>
                <AUTH_CLASS_USE/>
                <AUTHORIZATION_LEVEL/>
                <STATUS>D</STATUS>
                <STATUS_REASON>D58</STATUS_REASON>
                <USER_ID>999902</USER_ID>
                <DATE_TIMESTAMP>04/18/2019</DATE_TIMESTAMP>
            </AUTHORIZATION_SERVICES>
  </REMOVE_TAG>
 </AUTHORIZATION>
</AUTHORIZATIONS>

Подзапрос XMLAGG создает и «лишний» тег, который мне не нужен, который я назвал «REMOVE_TAG». В настоящее время я удаляю этот тег вручную, как только результаты отображаются в DBMS_Output.

Есть ли способ добавить к моему сценарию и использовать DELETEXML или DELETE NODE, чтобы его можно было полностью автоматизировать при записи в каталог?

...