PROBLEMA AO INSERIR UM ARQUIVO XML NO BD

Este forum é destinado a perguntas relacionadas a Oracle, mas que não se enquadram nos forums acima. Aqui serão tratadas também sobre outras tecnologias da oracle, como o Workflow, BPEL, Spatial, OCS, etc.
Responder
patricia
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Sex, 12 Mai 2006 2:15 am
Localização: poa - rs

Ao executar o procedimento abaixo no Oracle Database 10g Express Edition:

Selecionar tudo

DECLARE
b_Arquivo BFILE;
conteudo CLOB; 
BEGIN
b_Arquivo := bfilename('MY_XML', 'perfil.XML');
DBMS_LOB.fileOpen(b_Arquivo, dbms_lob.file_readonly);
DBMS_LOB.createtemporary(conteudo, TRUE, DBMS_LOB.session);
DBMS_LOB.loadFromFile(conteudo,b_Arquivo,DBMS_LOB.getLength(b_Arquivo),1,1);
DBMS_LOB.fileClose(b_Arquivo);
INSERT INTO TPerfil(IdDoc, Perfis)
VALUES(S_TPerfil_IdDoc.NEXTVAL, XMLType.createxml(conteudo));
END;

Ocorre o seguinte erro:
ORA-31011: falha no parse XML
ORA-19202: Ocorreu um erro no processamento XML
LPX-00210: esperava '<' em vez de '?'
Error at line 11. DECLARE
2. v_Arquivo bfile;
3. conteudo CLOB;
Conferi a estrutura do arquivo XML e não consta problemas como segue:

Selecionar tudo

<?xml version"1.0" encoding"utf-8" ?>
<PERFIS>
   <DESCRICAO> Cadastro de Perfil </DESCRICAO>
   <PERFIL ID="1">
      <NOME> Rafael Lisboa Carvalho </NOME>
      <PROFISSAO> Administrador de Redes </PROFISSAO >
      <EMAIL> admin@lasalle.tche.br </EMAIL>
      <CIDADE> Porto Alegre </CIDADE>
      <ESTADO> Rio Grande do Sul </ESTADO>
   </PERFIL>
   <PERFIL ID="2">
      <NOME> Carlos Alberto Mendes </NOME>
      <PROFISSAO> Analista de Sistemas </PROFISSAO>
      <EMAIL> cmendes@lasalle.tche.br </EMAIL>
      <CIDADE> Santa Cruz </CIDADE>
      <ESTADO> Rio Grande do Sul </ESTADO>
   </PERFIL>
   <PERFIL ID="3">
      <NOME> Adriana Aguiar </NOME>
      <PROFISSAO> Web Designer </PROFISSAO>
      <EMAIL> aaguiar@lasalle.tche.br </EMAIL>
      <CIDADE> Campinas </CIDADE>
      <ESTADO> São Paulo </ESTADO>
   </PERFIL>
</PERFIS>
Obrigada.
Patricia
gilbertoca
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 372
Registrado em: Ter, 24 Jan 2006 3:33 pm
Localização: Palmas - TO
Contato:

Oi Patricia! Desculpa pela demora!
Ajudo no forum, apenas no meu almoço ou aos fins de semana!

Seu documento xml está mau formado.

Selecionar tudo

<?xml version"1.0" encoding"utf-8"?>
deve ser assim:

Selecionar tudo

<?xml version="1.0" encoding="utf-8"?>
Até,

Gilberto
alegyn
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Sex, 04 Nov 2005 5:23 pm
Localização: Goiânia-GO

Boa tarde, colegas.

Em um de meus acessos do forum resolvi verificar o procedimento em questão. Porém, ao criar a tabela no oracle, o procedimente, e utilizar o arquivo xml com a mesma estrutura que o da colega Patricia, ainda assim deu um erro ao roda-lo no Sql *Plus Worksheet. Segue abaixo o erro reportado pelo aplicativo.

Selecionar tudo

ERRO na linha 1:
ORA-22285: non-existent directory or file for FILEOPEN operation
ORA-06512: at "SYS.DBMS_LOB", line 504
ORA-06512: at "SAMA.SPXML", line 7
ORA-06512: at line 1
Abraços.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother, seguinte... verifique as seguintes situações:

1) O diretório existe?
2) Se sim, você tem GRANT de READ neste objeto Directory?

qualquer coisa manda ai.
leandromiranda87
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 43
Registrado em: Ter, 20 Mar 2012 11:37 am
Localização: Campinas
Leandro L. Miranda

Boa tarde, estou com um problema em um código bastante semelhante a este do primeiro exemplo:

Selecionar tudo

create table custom_teste_xml (teste sys.xmltype)

CREATE OR REPLACE PROCEDURE ArmazenarXML AS
conteudo CLOB := ' ';
fonte bfile:= bfilename('D:\exercicios_001\Exercicios', 'contato001.xml');

BEGIN
DBMS_LOB.fileOpen(fonte, DBMS_LOB.file_readonly);
DBMS_LOB.loadFromFile(conteudo, fonte, DBMS_LOB.getLength(fonte), 1, 1);
DBMS_LOB.fileClose(fonte);
INSERT INTO custom_teste_xml(teste) VALUES(SYS.XMLType.createXML(conteudo));

END ArmazenarXML;

O problema é que na hora da execução a variável "fonte " recebe o valor

Selecionar tudo

'D:\exercicios_001\Exercicios/contato001.xml'
Com a / para a direita, enquanto deveria ser a barra \

Utilizo oracle 11g, windows xp e pl/sql developer

Podem me ajudar?
leandromiranda87
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 43
Registrado em: Ter, 20 Mar 2012 11:37 am
Localização: Campinas
Leandro L. Miranda

Consegui fazer a leitura, mas não a importação das informações.

A leitura foi corrigida criando um diretório, e chamando esse diretório em caixa alta.

Selecionar tudo

CREATE OR REPLACE PROCEDURE ArmazenarXML AS
 
AuxNomeDiretorio varchar2(100) := 'DIRETORIO_TESTE'; 
AuxNomeArquivo varchar2(100) := 'contato001.xml'; 
AuxArquivo bfile; 
AuxConteudo CLOB; 
AuxXML xmltype; 
begin 
-- create or replace directory Diretorio_teste as 'D:\exercicios_001'; 
-- 
AUXArquivo := bfilename(AuxNomeDiretorio,AuxNomeArquivo); 
-- 
sys.DBMS_LOB.fileOpen(AUXArquivo,sys.dbms_lob.file_readonly); 
-- 
sys.DBMS_LOB.createtemporary(AuxConteudo,TRUE,sys.DBMS_LOB.session); 
-- 
sys.DBMS_LOB.loadFromFile(AuxConteudo,AuxArquivo,sys.DBMS_LOB.getLength(AuxArquivo),1,1); 
-- 
sys.DBMS_LOB.fileClose(AuxArquivo); 
-- 
AuxXML := XMLType.createxml(AuxConteudo); 
-- 
Insert Into custom_teste_xml(teste) values(AuxXML); 
commit; 
end ArmazenarXML; 
O arquivo xml peguei no site do rodrigo almeida, mas não consegui postar aqui.. O fórum disse é spam

mas tive o mesmo resultado sem o parâmetro de encoding, ou mesmo com outros parâmetros conhecidos.
Erros:

Selecionar tudo

ORA-31011: falha no parse XML
ORA-19202: Ocorreu um erro no processamento XML 
LPX-00210: esperava '<' em vez de '?'
Acredito que isso se dá por que o texto do arquivo XML não é traduzido corretamente ou não está no padrão correto.

Sabem se é esse mesmo o problema?

Obrigado.
leandromiranda87
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 43
Registrado em: Ter, 20 Mar 2012 11:37 am
Localização: Campinas
Leandro L. Miranda

Olá,

Mais uma vez foi feito alterações no código e desta forma consegui fazer a importação do XML na base.

Selecionar tudo

CREATE OR REPLACE PROCEDURE ArmazenarXML AS
BEGIN

insert into custom_teste_xml (teste) values (xmltype(bfilename('DIRETORIO_TESTE','contato001.xml'),nls_charset_id('AL32UTF8')));

END ArmazenarXML;
A principal mudança foi a inserção do formato do arquivo XML: nls_charset_id('AL32UTF8')

No meu caso o problema foi resolvido.
Responder
  • Informação