Я написал скрипт 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
, чтобы его можно было полностью автоматизировать при записи в каталог?