Prezados,
Estou lendo dados de um arquivo xml. Acontece que a pessoa que gerou ese xml, não atentou para as boas práticas de testes e de vez em quando vem uma tag com mais de 33 mil caracteres.
Acontece que coloquei todo tipo de exception e não consegui capturar esse tipo de erro.
Alguém teria uma idéia de como capturar esse erro?
nodes := xmldom.getelementsbytagname(doc, 'descSituacao');
one_node := xmldom.item(nodes, 0);
begin
value_node := xmldom.getfirstchild(one_node);
desc_situacao := xmldom.getnodevalue(value_node);
exception
WHEN xmldom.INDEX_SIZE_ERR THEN
dbms_output.put_line( 'Index Size error----');
WHEN xmldom.DOMSTRING_SIZE_ERR THEN
dbms_output.put_line( 'String Size error');
WHEN xmldom.HIERARCHY_REQUEST_ERR THEN
dbms_output.put_line( 'Hierarchy request error');
WHEN xmldom.WRONG_DOCUMENT_ERR THEN
dbms_output.put_line( 'Wrong doc error');
WHEN xmldom.INVALID_CHARACTER_ERR THEN
dbms_output.put_line( 'Invalid Char error');
WHEN xmldom.NO_DATA_ALLOWED_ERR THEN
dbms_output.put_line( 'Nod data allowed error');
WHEN xmldom.NO_MODIFICATION_ALLOWED_ERR THEN
dbms_output.put_line( 'No mod allowed error');
WHEN xmldom.NOT_FOUND_ERR THEN
dbms_output.put_line( 'Not found error');
WHEN xmldom.NOT_SUPPORTED_ERR THEN
dbms_output.put_line( 'Not supported error');
WHEN xmldom.INUSE_ATTRIBUTE_ERR THEN
dbms_output.put_line( 'In use attr error');
WHEN OTHERS THEN
dbms_output.put_line( 'OTHERS');
end;
trecho que está dando erro.
acontece que o erro é gerado na api xmldom.
O campo descsituação está vindo com 50 mil caracteres, então o getnodevalue já gera erro. o que pode estar ocorrendo é o xmldom não está dando o raise para eu capturar o erro.
Procedure getxmlrecord(doc in xmldom.domdocument) is
nodes xmldom.domnodelist;
one_node xmldom.domnode;
node_map xmldom.domnamednodemap;
chave_origem varchar2(50);
ch_nfe varchar2(44);
dt_recbto varchar2(200);
nprot number;
cod_situacao varchar2(6);
desc_situacao varchar2(32767);
value_node xmldom.domnode;
--DECLARE
erro EXCEPTION;
PRAGMA EXCEPTION_INIT(erro, -24345);
begin
begin
nodes := xmldom.getelementsbytagname(doc, 'descSituacao');
one_node := xmldom.item(nodes, 0);
value_node := xmldom.getfirstchild(one_node);
desc_situacao := xmldom.getnodevalue(value_node);
exception
WHEN xmldom.INDEX_SIZE_ERR THEN
dbms_output.put_line('Index Size error----');
WHEN xmldom.DOMSTRING_SIZE_ERR THEN
dbms_output.put_line( 'String Size error');
WHEN xmldom.HIERARCHY_REQUEST_ERR THEN
dbms_output.put_line('Hierarchy request error');
WHEN xmldom.WRONG_DOCUMENT_ERR THEN
dbms_output.put_line( 'Wrong doc error');
WHEN xmldom.INVALID_CHARACTER_ERR THEN
dbms_output.put_line( 'Invalid Char error');
WHEN xmldom.NO_DATA_ALLOWED_ERR THEN
dbms_output.put_line( 'Nod data allowed error');
WHEN xmldom.NO_MODIFICATION_ALLOWED_ERR THEN
dbms_output.put_line( 'No mod allowed error');
WHEN xmldom.NOT_FOUND_ERR THEN
dbms_output.put_line( 'Not found error');
WHEN xmldom.NOT_SUPPORTED_ERR THEN
dbms_output.put_line('Not supported error');
WHEN xmldom.INUSE_ATTRIBUTE_ERR THEN
dbms_output.put_line( 'In use attr error');
WHEN erro THEN
dbms_output.put_line( 'In use attr error');
WHEN OTHERS THEN
dbms_output.put_line( 'OTHERS');
end;
end getxmlrecord;
Passos (testes) que eu faria:
~ debugar e verificar o lugar exato do erro.
~ usar uma variável LONG ou CLOB ao invés de varchar2.
~ testar somente a exception que te passei, apagando as outras.
~ e, se não funcionar mesmo assim, falar com o cara que gerou o arquivo... ensinar ele a programar ou sei o que
já debuguei.
é justamente quando eu chamo a função getnodevalue, essa função retorna um varchar2.
Como os valores são acima do permitido, gera esse erro, e pelo que estou percebendo não tem um raise;
O pessoal aqui quer ver funcionando independente do problema.
Vou abrir como arquivo texto e vou deixar de lado toda a funcionalidade que o xmldom me proporciona.
Fazer o quê?
Obedece quem tem juízo, apesar de não concordar .
o getnodevalues não tem como extrair por partes.
Por isso eu já optei por abrir como texto e pegar a primeira string da linha.
O usuário já confirmou que pode ser assim.
O certo seria limitar o tamanho do campo na escrita, mas como isso não desenvolvimento nosso, não temos como alterar, já vem um xml com 50000 caracteres, com o xmldom.getnodevalues pego o campo, não tem como pegar partes, só o campo todo.