manipulação arquivos XML

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
amarorafael
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 44
Registrado em: Qua, 14 Mar 2012 2:37 pm

Bom dia galera,
a minha dúvida é a seguinte:
tenho um arquivo do tipo xml no servidor (unix)
tenho que pegar esse arquivo e extrair o conteudo das tags e inseri-las em uma tabela previamente criada no banco.

Pesquisando neste forum, encontrei uma solução com relação ao pegar esse arquivo do servidor porém quando executo a rotina da o seguinte erro:

Selecionar tudo

ORA-06502: PL/SQL: erro: Invalid LOB locator specified: ORA-22275 numérico ou de valor ORA-06512 em "SYS.DBMS_LOB", line 5230ORA-06512: em line 8.
Segue a rotina:

Selecionar tudo

DECLARE
x_Arquivo BFILE;
x_conteudo CLOB := empty_clob;
var_dir VARCHAR2(100) := PACKAGE_NA_QUAL_PEGO_O_DIRETORIO;
BEGIN
x_Arquivo  := bfilename(var_dir, 'EXPORT_COMPONENT_HISTORY_1349281847907.xml');
DBMS_LOB.fileOpen(x_Arquivo, dbms_lob.file_readonly);
DBMS_LOB.createtemporary(x_conteudo, TRUE, DBMS_LOB.session);
DBMS_LOB.loadFromFile(x_conteudo,x_Arquivo,DBMS_LOB.getLength(x_Arquivo),1,1);
DBMS_LOB.fileClose(x_Arquivo);

END;
O erro acima está dando nesta linha:

Selecionar tudo

 DBMS_LOB.fileOpen(x_Arquivo, dbms_lob.file_readonly);
Algum poderia me ajudar a solucionar esse erro?
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Amarorafael,

Não conheço muito sobre operações com campos BLOB, mas pesquisei em alguns foruns e obtive algumas informações.

Primeiro, uma descrição do erro e possíveis ações corretivas:
OCI-22275: invalid LOB locator specified
Cause: There are several causes: (1) the LOB locator was never initialized; (2) the locator is for a BFILE and the routine expects a BLOB/CLOB/NCLOB locator; (3) the locator is for a BLOB/CLOB/NCLOB and the routine expects a BFILE locator; (4) trying to update the LOB in a trigger body -- LOBs in trigger bodies are read only.

Action: For (1), initialize the LOB locator by selecting into the locator variable or by setting the LOB locator to empty. For (2) and (3), pass the correct type of locator into the routine. For (4), remove the trigger body code that updates the LOB value.

Pelo que pude entender do link citado a seguir (http://www.orafaq.com/forum/t/50203/2/) você precisaria inicializar "LOB locator" antes de tentar manipular o LOB. O comando que você deveria utilizar neste caso seria o DBMS_LOB.CREATETEMPORARY. Seu código (não testei) ficaria algo parecido com :

Selecionar tudo

....
DECLARE
x_Arquivo BFILE;
x_conteudo CLOB := empty_clob;
var_dir VARCHAR2(100) := PACKAGE_NA_QUAL_PEGO_O_DIRETORIO;
BEGIN

--- Adicione esta linha ao seu código
DBMS_LOB.CREATETEMPORARY(x_conteudo,true);

x_Arquivo  := bfilename(var_dir, 'EXPORT_COMPONENT_HISTORY_1349281847907.xml');
DBMS_LOB.fileOpen(x_Arquivo, dbms_lob.file_readonly);
DBMS_LOB.createtemporary(x_conteudo, TRUE, DBMS_LOB.session);
DBMS_LOB.loadFromFile(x_conteudo,x_Arquivo,DBMS_LOB.getLength(x_Arquivo),1,1);
DBMS_LOB.fileClose(x_Arquivo);
END;
...
Não saberia dizer se o código alterado acima estaria OK. Se precisar visualizar o exemplo do forum, consulte o link http://www.orafaq.com/forum/t/50203/2/, que apresenta um exemplo de código completo.

Espero que as informações acima ajudem você a resolver seu problema.

Fique à vontade para atualizar este tópico, caso precise de alguma outra orientação.

Abraços,

Sergio Coutinho
marlonpasquali
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 248
Registrado em: Sex, 06 Fev 2009 3:02 pm
Localização: ERECHIM - RS

Eu já criei a um tempo atras uma rotina para ler xml de notas fiscais. O servidor é Linux. Ficou assim:

Criar diretório no servidor

Selecionar tudo

create directory XML_DIR as '/u03/oracle/PROD/ebsout'
criar tabela com campo do tipo xml

Selecionar tudo

create table pcn_xml (registro number(10),
                                 nota xmltype,
                                 creation_date date,
                                 nomearq varchar2(200))
-- Insere o arquivo XML na base de dados
-- O XML tem que estar na pasta \u03\oracle\PROD\ebsout

Selecionar tudo

begin
  vi_log :=1;
  AUXArquivo := bfilename(AuxNomeDiretorio,AuxNomeArquivo);
  DBMS_LOB.fileOpen(AuxArquivo,dbms_lob.file_readonly);
  DBMS_LOB.createtemporary(AuxConteudo,TRUE,DBMS_LOB.session);
  DBMS_LOB.loadFromFile(AuxConteudo,AuxArquivo,DBMS_LOB.getLength(AuxArquivo),1,1);
  DBMS_LOB.fileClose(AuxArquivo);
  AuxXML := XMLType.createxml(AuxConteudo);

  Insert Into pcn_xml(registro,creation_date,nomearq,nota) values(ViRegistro,sysdate,Arquivo,AuxXML);
  commit;
end;
depois é ler o xml de suas tags e jogar para a tabela que você precisa dos dados.

Att,
Marlon
Responder
  • Informação