Leitura de 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
Nelson
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Ter, 09 Jun 2009 9:44 am
Localização: São Paulo

Srs, boa tarde
Pesquisei , pesquisei e não encontrei.
A dúvida com relação ao diretório para importação de arquivo XML persiste.

Podem me ajudar ??

A procedure LOAD_XML está criada assim:

Selecionar tudo

CREATE OR REPLACE PROCEDURE load_xml ( p_id IN  NUMBER,
p_filename  IN  VARCHAR2) AS
l_bfile    BFILE := BFILENAME( 'XMLDIR', p_filename);
targetfile BFILE;
l_clob     CLOB;
BEGIN
targetfile := l_bfile;
DBMS_LOB.createtemporary (l_clob, TRUE);
DBMS_LOB.fileopen(targetfile, DBMS_LOB.file_readonly);
DBMS_LOB.loadfromfile(l_clob, targetfile, DBMS_LOB.getlength(targetfile));
DBMS_LOB.fileclose(targetfile);

INSERT INTO INFO_XML (id,data_atualizacao,conteudo)VALUES (
p_id,sysdate,XMLTYPE.createXML(l_clob)  );
COMMIT;

DBMS_LOB.freetemporary (l_clob);
END;
/
No programa(forms) eu executo:

Selecionar tudo

LOAD_XML (p_id=>7, p_filename => 'xml_teste07.xml'); -- nfe da sefaz
O XMLDIR foi criado assim:

Selecionar tudo

create or replace directory XMLDIR as '/tmp/sms';
A tabela foi criada assim:

Selecionar tudo

create table INFO_XML (id number primary key, data_atualizacao date default sysdate,  conteudo  XMLType);
Importa legal.

Só que eu tenho que copiar o arquivo pro diretório do servidor Oracle.

Preciso ler o arquivo XML do diretório 'c:\temp\' (por exemplo), ou outro diretório que NÃO O DO SERVIDOR ORACLE.

vocês, podem me ajudar ???
Grato
Nelson
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á pessoal,

Estou fazendo a importação e tratamento de arquivos XML na base Oracle. Todo o processo de identificação dos arquivos XML no diretório, importação dos arquivos na base está ok. Não estou conseguindo fazer a leitura dos dados da table sys.xmltype.

Já tentei fazer a leitura de várias formas, mas nenhuma delas com sucesso.

--ETAPA DE LEITURA DOS ARQUIVOS XML E IMPORTAÇÃO PARA BD

Selecionar tudo

---CRIA DIRETÓRIOS PARA LEITURA E GRAVAÇÃO DOS ARQUIVOS

CREATE OR REPLACE DIRECTORY d_received_files AS 'D:\Receive';
CREATE OR REPLACE DIRECTORY d_bkp_received_files AS 'D:\Bkp_Receive';
CREATE OR REPLACE DIRECTORY d_sended_files AS 'D:\Send';
CREATE OR REPLACE DIRECTORY d_bkp_sended_files AS 'D:\Bkp_Send';


---GRANT LEITURA E GRAVAÇÃO NOS DIRETÓRIOS (USUÁRIO SYS)

GRANT READ, WRITE ON DIRECTORY d_received_files TO mlxlevesul;
GRANT READ, WRITE ON DIRECTORY d_bkp_received_files TO mlxlevesul;
GRANT READ, WRITE ON DIRECTORY d_sended_files TO mlxlevesul;
GRANT READ, WRITE ON DIRECTORY d_bkp_sended_files TO mlxlevesul;


---CRIA TABELA QUE RECEBERÁ O CONTEÚDO DOS ARQUIVOS XML
CREATE TABLE custom_xml_received(
       nome_arquivo         VARCHAR2(200),
       caminho_arquivo      VARCHAR2(4000),
       conteudo_arquivo     SYS.XMLTYPE,
       data_recepcao        DATE DEFAULT SYSDATE);
       
       
---GRANT GRAVAÇÃO A TABELA AOS USUÁRIOS (USUÁRIO SYS)
GRANT ALL ON custom_xml_received TO mlxlevesul;


---GRANT ACESSO A PACK DBMS_BACKUP_RESTORE (USUÁRIO SYS)
GRANT ALL ON DBMS_BACKUP_RESTORE TO mlxlevesul;


---GRANT LEITURA A VIEW XKRBMSFT
GRANT SELECT ON XKRBMSFT TO mlxlevesul;



---CRIA PROCEDURE PARA SELECIONAR TODOS OS ARQUIVOS DO DIRETÓRIO RECEIVE

CREATE OR REPLACE PROCEDURE custom_list_received_archives
(directory IN VARCHAR2,
  v_error_code_arm OUT NUMBER)
IS

     PROCNAME CONSTANT VARCHAR2(100) := 'custom_list_received_archives';

     ns          VARCHAR2(1024);
     v_directory VARCHAR2(1024);

     v_error_code NUMBER;
     v_error_text VARCHAR2(300);

     CURSOR c_archive_names IS
     SELECT fname_archive, fname_krbmsft
     FROM sys.xkrbmsft;

     r_archive_names c_archive_names%ROWTYPE;

BEGIN
      OPEN c_archive_names;

      v_directory := directory;
      sys.dbms_backup_restore.searchfiles(v_directory, ns);

      v_error_code := 0;
      v_error_text := '';

FOR each_file IN (SELECT fname_krbmsft AS name FROM sys.xkrbmsft) LOOP

      EXIT WHEN c_archive_names%NOTFOUND;

      FETCH c_archive_names INTO r_archive_names;

     custom_armazenar_xml(v_file    => r_archive_names.fname_archive,
                          v_caminho => r_archive_names.fname_krbmsft,
                          v_error_code_out => v_error_code_arm);

     IF v_error_code_arm = 0 /*AND r_archive_names.fname_archive IN (SELECT nome_arquivo FROM custom_xml_received)*/ THEN

        UTL_FILE.FCOPY(SRC_LOCATION  => 'D_RECEIVED_FILES',
                       SRC_FILENAME  => R_ARCHIVE_NAMES.FNAME_ARCHIVE,
                       DEST_LOCATION => 'D_BKP_RECEIVED_FILES',
                       DEST_FILENAME => R_ARCHIVE_NAMES.FNAME_ARCHIVE);

        UTL_FILE.FREMOVE(LOCATION => 'D_RECEIVED_FILES',
                         FILENAME => R_ARCHIVE_NAMES.FNAME_ARCHIVE);

     END IF;

END LOOP;
CLOSE c_archive_names;

EXCEPTION
    WHEN OTHERS THEN
      v_error_code := SQLCODE;
      v_error_text := SUBSTR(SQLERRM, 1, 300);

END;




---CRIA PROCEDURE PARA INSERÇÃO DO CONTEÚDO DOS ARQUIVOS EM TABELA

CREATE OR REPLACE PROCEDURE custom_armazenar_xml (v_file           IN VARCHAR2,
                                                  v_caminho        IN VARCHAR2,
                                                  v_error_code_out OUT NUMBER) AS
                                                  
     v_error_code NUMBER := 0;
     v_error_text VARCHAR2(300) := '';

BEGIN
  v_error_code_out := 0;
  
  INSERT INTO custom_xml_received
    (nome_arquivo, caminho_arquivo, conteudo_arquivo)
  VALUES
    (v_file, v_caminho, xmltype(bfilename('D_RECEIVED_FILES', v_file),nls_charset_id('AL32UTF8')));

  COMMIT;

EXCEPTION
    WHEN OTHERS THEN
      v_error_code := SQLCODE;
      v_error_text := SUBSTR(SQLERRM, 1, 300);
      
      v_error_code_out := v_error_code;

END custom_armazenar_xml;

--ETAPA LEITURA DAS TAGS
Tentei fazer com EXTRACT() -- Sem sucesso

Selecionar tudo

SELECT extract(xt.conteudo_arquivo, '/AGENDA/CONTATO/ID').getnumberval() ID,
        extract(xt.conteudo_arquivo, '/AGENDA/CONTATO/NOME').getstringval() NOME,
        extract(xt.conteudo_arquivo, '/AGENDA/CONTATO/SOBRENOME').getstringval() SOBRENOME,
        extract(xt.conteudo_arquivo, '/AGENDA/CONTATO/EMAIL').getstringval() EMAIL,
        extract(xt.conteudo_arquivo, '/AGENDA/CONTATO/TELEFONE').getstringval() TELEFONE
  FROM custom_xml_received XT/*,
       TABLE(XMLSequence(Extract(XT.conteudo_arquivo , '/AGENDA'))) AGENDA,              -- Master
       TABLE(XMLSequence(Extract(VALUE(AGENDA) , '/AGENDA/CONTATO'))) CONTATO */           -- Detalhes
WHERE XT.nome_arquivo = 'contato001.XML'

ExtractValue() -- Sem sucesso

Selecionar tudo

SELECT extractvalue(VALUE(AGENDA), '/AGENDA/ID') ID,
        extractvalue(VALUE(AGENDA), '/AGENDA/NOME') NOME,
        extractvalue(VALUE(AGENDA), '/AGENDA/SOBRENOME') SOBRENOME
  FROM custom_xml_received XT,
       TABLE(XMLSequence(Extract(XT.conteudo_arquivo , '/AGENDA'))) AGENDA           -- Detalhes
WHERE XT.nome_arquivo = 'contato001.XML'

O mais próximo que cheguei até agora:
O resultado vem vazio (null)

Selecionar tudo

SELECT extractvalue(xt.conteudo_arquivo, '/AGENDA/CONTATO/ID') ID,
        extractvalue(xt.conteudo_arquivo, '/AGENDA/CONTATO/NOME') NOME,
        extractvalue(xt.conteudo_arquivo, '/AGENDA/CONTATO/SOBRENOME') SOBRENOME,
        extractvalue(xt.conteudo_arquivo, '/AGENDA/CONTATO/EMAIL') EMAIL,
        extractvalue(xt.conteudo_arquivo, '/AGENDA/CONTATO/TELEFONE') TELEFONE
  FROM custom_xml_received XT/*,
       TABLE(XMLSequence(Extract(XT.conteudo_arquivo , '/AGENDA'))) AGENDA,              -- Master
       TABLE(XMLSequence(Extract(VALUE(AGENDA) , '/AGENDA/CONTATO'))) CONTATO */           -- Detalhes
WHERE XT.nome_arquivo = 'contato001.XML'

Segue também exemplo do arquivo XML

Selecionar tudo

<?xml version="1.0"?>
<agenda>
   <contato id="1">
      <nome>Rodrigo</nome>
      <sobrenome>Almeida</sobrenome>
      <email>contato@rodrigoalmeida.net</email>
      <telefone tipo="res">11 9999 9999</telefone>
      <telefone tipo="com">11 8888 8888</telefone>
   </contato>
</agenda>

Podem me ajudar com este problema?

Att,
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Saudações a todos.

Ando estudando a leitura de arquivos XML. Agora me surgiram algumas duvidas.
Como eu faria para ler um arquivo que desconheço o layout?

Na verdade eu conheço o layout. Mas são 17 possiveis layouts e eu quero tratar tudo em uma unica leitura...
e_muniz
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Qua, 01 Jul 2009 10:35 am
Localização: Belo Horizonte / MG

Também tenho dificuldades com vários layouts de XMLs e precisaria de algo semelhante a um "select * from tabela" isso me retornaria todos os campos do xml e assim me permitiria seguir com a validação do xml.

Obrigado
shinobyghost
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qui, 18 Jun 2015 10:10 am
Localização: Bauru/SP

Boa tarde, eu sou novo em plsql e xml, gostaria da ajuda de todos para solucionar meu problema.
Eu tenho o Oracle 11gr2 instalado em um Windows Server 2008.

Preciso configurar o servidor e criar uma procedure que leia o conteúdo do xml e insira as informações nas tabelas correspondentes.

As tabelas são as seguintes:

Selecionar tudo

CREATE TABLE ALUNO(
	ALUNO_ID NUMBER(6,0) PRIMARY KEY,
	FIRST_NAME VARCHAR2(150),
	LAST_NAME VARCHAR2(150),
	EMAIL VARCHAR2(150),
	PHONE_NUMBER VARCHAR2(150),
	CPF NUMBER(11,0)
);

---------------------------------------------------

CREATE TABLE CURSO(
	CURSO_ID NUMBER(6,0) PRIMARY KEY,
	ALUNO_ID NUMBER(6,0),
	MATERIA_ID NUMBER(6,0),
	NOTA NUMBER(4,2),
	DATAHORA DATE
);
 
Eu tenho um xml assim:

Selecionar tudo

<?xml version="1.0" encoding="windows 1252" ?> 
  <listaalunos>
  <aluno>
  <id>1001</id> 
  <firstname>HUGO</firstname> 
  <lastname>GELADEIRA</lastname> 
  <email>hugo@hotmail.com</email>
  <phone>988665522</phone>
  <cpf>22722722764</cpf> 
  <curso_id>101</curso_id> 
  <idmateria>13</idmateria> 
  <nota>8,75</nota>
  <data>14/07/2015</data>
  </aluno>
  <aluno>
  <firstname>RODRIGO</firstname> 
  <lastname>TESTE</lastname> 
  <email>rodrigo@hotmail.com</email>
  <phone>988772211</phone>
  <cpf>25825825897</cpf> 
  <curso_id>102</curso_id> 
  <idmateria>12</idmateria> 
  <nota>9,75</nota>
  <data>14/07/2015</data>
  </aluno>
  </listaalunos>
Eu tenho que inserir esse xml nas duas tabelas acima.
Como que eu poderia fazer isso usando UTL_FILE, ExtractValue...
Já testei conforme algumas respostas deste posto, mas deram erro...
Muito obrigado pela atenção de todos...
Caio549
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Sex, 18 Set 2015 9:12 pm

Pessoal boa noite, por favor estou com dificuldades para extrair uma informação do xml, pois ele tem tags repetidas

Li os topicos acima, porém não consegui fazer funcionar.

Exemplo:

o xml abaixo esta na minha tabela "tmp_xml" e coluna "xml"

Selecionar tudo

<NFe xmlns="http://www.portalfiscal.inf.br/nfe">
  <infNFe Id="NFe35080599999090910270550010000000015180051273" versao="1.10">
    <ide>
      <cUF>35</cUF>
      <cNF>518005127</cNF>
      <natOp>Venda a vista</natOp>
      <indPag>0</indPag>
      <mod>55</mod>
      <serie>1</serie>
      <nNF>1</nNF>
      <dEmi>2008-05-06</dEmi>
      <dSaiEnt>2008-05-06</dSaiEnt>
      <tpNF>0</tpNF>
      <cMunFG>3550308</cMunFG>
      <tpImp>1</tpImp>
      <tpEmis>1</tpEmis>
      <cDV>3</cDV>
      <tpAmb>2</tpAmb>
      <finNFe>1</finNFe>
      <procEmi>0</procEmi>
      <verProc>NF-eletronica.com</verProc>
    </ide>
    <emit>
      <CNPJ>99999090910270</CNPJ>
      <xNome>NF-e Associacao NF-e</xNome>
      <xFant>NF-e</xFant>
      <enderEmit>
        <xLgr>Rua Central</xLgr>
        <nro>100</nro>
        <xCpl>Fundos</xCpl>
        <xBairro>Distrito Industrial</xBairro>
        <cMun>3502200</cMun>
        <xMun>Angatuba</xMun>
        <UF>SP</UF>
        <CEP>17100171</CEP>
        <cPais>1058</cPais>
        <xPais>Brasil</xPais>
        <fone>1733021717</fone>
      </enderEmit>
      <IE>123456789012</IE>
    </emit>
    <dest>
      <CNPJ>00000000000191</CNPJ>
      <xNome>DISTRIBUIDORA DE AGUAS MINERAIS</xNome>
      <enderDest>
        <xLgr>AV DAS FONTES</xLgr>
        <nro>1777</nro>
        <xCpl>10 ANDAR</xCpl>
        <xBairro>PARQUE FONTES</xBairro>
        <cMun>5030801</cMun>
        <xMun>são Paulo</xMun>
        <UF>SP</UF>
        <CEP>13950000</CEP>
        <cPais>1058</cPais>
        <xPais>BRASIL</xPais>
        <fone>1932011234</fone>
      </enderDest>
      <IE> </IE>
    </dest>
    <retirada>
      <CNPJ>99171171000194</CNPJ>
      <xLgr>AV PAULISTA</xLgr>
      <nro>12345</nro>
      <xCpl>TERREO</xCpl>
      <xBairro>CERQUEIRA CESAR</xBairro>
      <cMun>3550308</cMun>
      <xMun>são PAULO</xMun>
      <UF>SP</UF>
    </retirada>
    <entrega>
      <CNPJ>99299299000194</CNPJ>
      <xLgr>AV FARIA LIMA</xLgr>
      <nro>1500</nro>
      <xCpl>15 ANDAR</xCpl>
      <xBairro>PINHEIROS</xBairro>
      <cMun>3550308</cMun>
      <xMun>são PAULO</xMun>
      <UF>SP</UF>
    </entrega>
    <det nItem="1">
      <prod>
        <cProd>00001</cProd>
        <cEAN/>
        <xProd>Agua Mineral</xProd>
        <CFOP>5101</CFOP>
        <uCom>dz</uCom>
        <qCom>1000000.0000</qCom>
        <vUnCom>1</vUnCom>
        <vProd>10000000.00</vProd>
        <cEANTrib/>
        <uTrib>und</uTrib>
        <qTrib>12000000.0000</qTrib>
        <vUnTrib>1</vUnTrib>
      </prod>
      <imposto>
        <ICMS>
          <ICMS00>
            <orig>0</orig>
            <CST>00</CST>
            <modBC>0</modBC>
            <vBC>10000000.00</vBC>
            <pICMS>18.00</pICMS>
            <vICMS>1800000.00</vICMS>
          </ICMS00>
        </ICMS>
        <PIS>
          <PISAliq>
            <CST>01</CST>
            <vBC>10000000.00</vBC>
            <pPIS>0.65</pPIS>
            <vPIS>65000</vPIS>
          </PISAliq>
        </PIS>
        <COFINS>
          <COFINSAliq>
            <CST>01</CST>
            <vBC>10000000.00</vBC>
            <pCOFINS>2.00</pCOFINS>
            <vCOFINS>200000.00</vCOFINS>
          </COFINSAliq>
        </COFINS>
      </imposto>
    </det>
    <det nItem="2">
      <prod>
        <cProd>00002</cProd>
        <cEAN/>
        <xProd>Agua Mineral</xProd>
        <CFOP>5101</CFOP>
        <uCom>pack</uCom>
        <qCom>5000000.0000</qCom>
        <vUnCom>2</vUnCom>
        <vProd>10000000.00</vProd>
        <cEANTrib/>
        <uTrib>und</uTrib>
        <qTrib>3000000.0000</qTrib>
        <vUnTrib>0.3333</vUnTrib>
      </prod>
      <imposto>
        <ICMS>
          <ICMS00>
            <orig>0</orig>
            <CST>00</CST>
            <modBC>0</modBC>
            <vBC>10000000.00</vBC>
            <pICMS>18.00</pICMS>
            <vICMS>1800000.00</vICMS>
          </ICMS00>
        </ICMS>
        <PIS>
          <PISAliq>
            <CST>01</CST>
            <vBC>10000000.00</vBC>
            <pPIS>0.65</pPIS>
            <vPIS>65000</vPIS>
          </PISAliq>
        </PIS>
        <COFINS>
          <COFINSAliq>
            <CST>01</CST>
            <vBC>10000000.00</vBC>
            <pCOFINS>2.00</pCOFINS>
            <vCOFINS>200000.00</vCOFINS>
          </COFINSAliq>
        </COFINS>
      </imposto>
    </det>


Preciso extrair as informações dos itens que estao a partir da tag <det nItem="1">

Comando que estou utilizando:

Selecionar tudo

 SELECT EXTRACTVALUE(xml,
                    '//det/@nItem',
                    'xmlns="http://www.portalfiscal.inf.br/nfe"') as num
  FROM TMP_XML a;

O oracle me dá um erro ORA-19025(RETORNA VALOR DE APENAS UM NÓ)

alguém sabe, como consigo extrair essa informação?
saziba
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Dom, 22 Fev 2015 11:04 am

Caio,

A resposta simples para a sua pergunta é a seguinte:

Selecionar tudo

SELECT EXTRACTVALUE(xml,
'//det[1]/@nItem',
'xmlns="http://www.portalfiscal.inf.br/nfe"') as num
FROM TMP_XML a;
Mas eu aconselho a não utilizar mais a função EXTRACTVALUE, pois a Oracle descontinuou essa funcionalidade no 11g release 2, mantendo-a somente para retrocompatibilização. Vide o link:
http://docs.oracle.com/cd/E11882_01/ser ... SQLRF06173

A abordagem que eu recomendo para o seu caso é utilizando a sintaxe XMLTABLE, a partir do seguinte exemlo:

Selecionar tudo

SELECT x.*
FROM   tmp_xml t,
       XMLTABLE(XMLNAMESPACES(DEFAULT 'http://www.portalfiscal.inf.br/nfe'),
                'NFe/infNFe/det' PASSING t.xml
                COLUMNS cProd VARCHAR2(4000) PATH 'prod/cProd'
                       ,nItem VARCHAR2(4000) PATH '@nItem') x;
Recomendo bastante que você se familiarize-se com essa sintaxe. A partir do 10g já se pode usá-la e se for no 11g2, então é melhor ainda. Não crie um código legado novinho em folha.

PS.
Tive que fechar umas tags ao final do seu XML para poder testar...
saziba
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Dom, 22 Fev 2015 11:04 am

shinobyghost escreveu:Boa tarde, eu sou novo em plsql e xml, gostaria da ajuda de todos para solucionar meu problema.
Eu tenho o Oracle 11gr2 instalado em um Windows Server 2008.

Preciso configurar o servidor e criar uma procedure que leia o conteúdo do xml e insira as informações nas tabelas correspondentes.

As tabelas são as seguintes:

Selecionar tudo

CREATE TABLE ALUNO(
	ALUNO_ID NUMBER(6,0) PRIMARY KEY,
	FIRST_NAME VARCHAR2(150),
	LAST_NAME VARCHAR2(150),
	EMAIL VARCHAR2(150),
	PHONE_NUMBER VARCHAR2(150),
	CPF NUMBER(11,0)
);

---------------------------------------------------

CREATE TABLE CURSO(
	CURSO_ID NUMBER(6,0) PRIMARY KEY,
	ALUNO_ID NUMBER(6,0),
	MATERIA_ID NUMBER(6,0),
	NOTA NUMBER(4,2),
	DATAHORA DATE
);
 
Eu tenho um xml assim:

Selecionar tudo

<?xml version="1.0" encoding="windows 1252" ?> 
  <listaalunos>
  <aluno>
  <id>1001</id> 
  <firstname>HUGO</firstname> 
  <lastname>GELADEIRA</lastname> 
  <email>hugo@hotmail.com</email>
  <phone>988665522</phone>
  <cpf>22722722764</cpf> 
  <curso_id>101</curso_id> 
  <idmateria>13</idmateria> 
  <nota>8,75</nota>
  <data>14/07/2015</data>
  </aluno>
  <aluno>
  <firstname>RODRIGO</firstname> 
  <lastname>TESTE</lastname> 
  <email>rodrigo@hotmail.com</email>
  <phone>988772211</phone>
  <cpf>25825825897</cpf> 
  <curso_id>102</curso_id> 
  <idmateria>12</idmateria> 
  <nota>9,75</nota>
  <data>14/07/2015</data>
  </aluno>
  </listaalunos>
Eu tenho que inserir esse xml nas duas tabelas acima.
Como que eu poderia fazer isso usando UTL_FILE, ExtractValue...
Já testei conforme algumas respostas deste posto, mas deram erro...
Muito obrigado pela atenção de todos...
Veja se ajuda...

Selecionar tudo

INSERT ALL
  WHEN 1 = 1 THEN
    INTO aluno (aluno_id,first_name,last_name,email,phone_number,cpf) 
      VALUES(id, firstname, lastname, email, phone, cpf)
  WHEN 1 = 1 THEN
    INTO CURSO (curso_id, aluno_id, materia_id, nota, datahora) 
      VALUES(curso_id, ID, idmateria, nota, datahora)
SELECT to_number(x.id) ID
      ,firstname 
      ,lastname 
      ,email    
      ,phone    
      ,to_number(cpf) cpf
      ,to_number(curso_id) curso_id
      ,to_number(idmateria) idmateria
      ,to_number(nota) nota
      ,TO_DATE(DATA,'dd/mm/yyyy') DATAhora
FROM   tmp_xml t
      ,xmltable('listaalunos/aluno' passing t.xml COLUMNS
                id VARCHAR2(4000) path 'id'
               ,firstname VARCHAR2(4000) path 'firstname'
               ,lastname  VARCHAR2(4000) path 'lastname'
               ,email     VARCHAR2(4000) path 'email'
               ,phone     VARCHAR2(4000) path 'phone'
               ,cpf       VARCHAR2(4000) path 'cpf'
               ,curso_id  VARCHAR2(4000) path 'curso_id'
               ,idmateria VARCHAR2(4000) path 'idmateria'
               ,nota      VARCHAR2(4000) path 'nota'
               ,data      VARCHAR2(4000) path 'data') x;
Responder
  • Informação
  • Quem está online

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