ORA - 24345

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
alexrsilva
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 153
Registrado em: Ter, 27 Mai 2008 1:31 pm
Localização: Rio de Janeiro - RJ
Alex Silva
Analista de Sistemas
11i.10 Applications Developer Implementation Champion
11i.10 E-Business Suite Integration Champion

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?

segue o trecho que tem a tag problemática.

Selecionar tudo


 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;
Att,
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

Cara...
Já tentou criar uma exceção?

faz assim...

Selecionar tudo

 DECLARE
  erro EXCEPTION;
  PRAGMA EXCEPTION_INIT(erro, -24345);
BEGIN

...
...
...

EXCEPTION
WHEN erro THEN
  MENSAGEM DE ERRO!
END;
Tenta isso.

Abraço.
alexrsilva
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 153
Registrado em: Ter, 27 Mai 2008 1:31 pm
Localização: Rio de Janeiro - RJ
Alex Silva
Analista de Sistemas
11i.10 Applications Developer Implementation Champion
11i.10 E-Business Suite Integration Champion

Tentei,
Não funcionou.
É uma exceção que não se consegue capturar?
Tentei quase tudo e nada funcionou.

O pior é que o erro é de quem envia, mas temos que tratar aqui por que não sabemos o que pode vir do outro lado.

Att,
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

Manda ai como ficou o código depois dessa sugestão...
Deveria funcionar :?
alexrsilva
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 153
Registrado em: Ter, 27 Mai 2008 1:31 pm
Localização: Rio de Janeiro - RJ
Alex Silva
Analista de Sistemas
11i.10 Applications Developer Implementation Champion
11i.10 E-Business Suite Integration Champion

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.

Selecionar tudo

 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;

Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

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 :P
alexrsilva
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 153
Registrado em: Ter, 27 Mai 2008 1:31 pm
Localização: Rio de Janeiro - RJ
Alex Silva
Analista de Sistemas
11i.10 Applications Developer Implementation Champion
11i.10 E-Business Suite Integration Champion

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 .

Valeu.
RodrigoValentim
Moderador
Moderador
Mensagens: 367
Registrado em: Ter, 25 Mar 2008 3:41 pm
Localização: Salvador - BA
Rodrigo Valentim
Analista de Sistemas
Oracle Developer

Campanha: Faça uma pesquisa antes de perguntar!!!

Já tentou extrair o valor por partes?
alexrsilva
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 153
Registrado em: Ter, 27 Mai 2008 1:31 pm
Localização: Rio de Janeiro - RJ
Alex Silva
Analista de Sistemas
11i.10 Applications Developer Implementation Champion
11i.10 E-Business Suite Integration Champion

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.

Grato,
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 4 visitantes