Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Gu Oliveira

Criando xml com base em tabela

Recommended Posts

Pessoal,
Bom dia!
Pesquisei bastante nos tópicos de xml, porém não encontrei resposta pra minhas dúvidas!
1º) Preciso gerar um arquivo xml, com o resultado de uma consulta do oracle.
Esse primeiro passo já está OK, porém existem alguns campos que eu não tenho informação ( na tabela, ficam como null ) porém eu preciso dessa tag no arquivo.
Ao gerar via comando abaixo, ele simplismente ignora os campos nulos e não cria a tag que eu preciso.
Consegui ser claro na explicação da dúvida?

 

create or replace procedure gerar_xml is

v_file Utl_File.File_Type;
v_xml CLOB;

BEGIN
DECLARE

v_file Utl_File.File_Type;
v_xml CLOB;
v_more BOOLEAN := TRUE;

v_conteudo_arquivo sys.xmltype;

BEGIN
V_XML := DBMS_XMLQUERY.getXML('SELECT * FROM custom_xml');
-- V_XML := DBMS_XMLGEN.getXMLType('SELECT * FROM custom_xml');

V_FILE := UTL_FILE.fopen('C_RECEIVED_FILES', 'TESTE.XML', 'w');

WHILE V_MORE LOOP
UTL_FILE.PUT(V_FILE, SUBSTR(V_XML, 1, 32767));

IF LENGTH(V_XML) > 32767 THEN
V_XML := SUBSTR(V_XML, 32768);
ELSE
V_MORE := FALSE;
END IF;
END LOOP;

UTL_FILE.fclose(V_FILE);

EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(Substr(SQLERRM, 1, 255));
Utl_File.FClose(v_file);

END;

END;

 



2º) O cabeçalho do arquivo xml está sendo gerado da seguinte forma:
<?xml version = '1.0'?>
<ROWSET>

Como eu conseguiria alterar a tag "rowset" para um nome de minha preferência?

Obrigado desde já a todos! =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ao invés de

 

 

SELECT * FROM custom_xml

 

Use

 


SELECT coluna1,coluna2,nvl(coluna3,' ') coluna3 FROM custom_xml

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mota,
Infelizmente do jeito que você propôs dá erro ao gerar o xml.

As aspas estão finalizadas... rs

O comando ficou assim:

V_XML := DBMS_XMLQUERY.getXML('SELECT DT,NUMLINHA,SKU,NVL(UNID_MANEJO,''),TESTE FROM custom_xml');

 

Segue msg em anexo.

 

 

<?xml version = '1.0'?>
<ERROR>oracle.xml.sql.OracleXMLSQLException: ORA-01756: string entre aspas não finalizada adequadamente
</ERROR>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma solução simples

 

 

  vs_espaco char(1) := ' ';



  V_XML := DBMS_XMLQUERY.getXML('SELECT DT,NUMLINHA,SKU,NVL(UNID_MANEJO,vs_espaco),TESTE FROM custom_xml');

Ou ''' para uma aspas, mas nunca acerto isto de prima.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta,
Infelizmente ele dá erro ao tentar gerar assim também.

 

<ERROR>oracle.xml.sql.OracleXMLSQLException: ORA-00904: "VS_ESPACO": identificador inválido<ERROR>oracle.xml.sql.OracleXMLSQLException: ORA-00904: "VS_ESPACO": identificador inválido

 

 

Acho que uma solução viável, seria criar os campos nas tabelas, e popular com espaços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Passando aspas ...

 

 

declare
  vs varchar2(255);
begin
  vs := 'select nvl(cluster_name,''' || ''') from user_tables';
  dbms_output.put_line(vs);
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mota, pode fechar este tópico por gentileza?
Vou tentar fazer usando os pacotes xmlforest/xmlelement e caso tenha alguma dúvida, eu abro um novo post, mas antes irei pesquisar.

MUITISSIMO obrigado !!!!!!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal,
Consegui uma solução para gerar o xml do jeito correto, segue abaixo:

     select xmlelement("Confirmacaoseparacao", 

                  xmlforest(teste1.clmcl,
                            teste1.codfilial,
                            teste1.dtcriacao,
                            teste1.atualizacao ),
                            xmlelement("OrdemCarga",
                            xmlforest(teste1.NumDoctoTrans),
                            xmlforest(teste1.NumOrdemCarga),
                            xmlforest(teste1.CodLocalSaida),
                            xmlforest(teste1.CodTransportadora),
                            xmlforest(teste1.NumRomaneio),
                            xmlforest(teste1.placaveiculo),
                xmlelement("Remessas",
                    xmlelement("Remessa",
                       xmlforest(teste1.numremessa),
                          xmlelement("Itens",
                            xmlelement("Item",
                            xmlforest(teste1.numlinha),
                            xmlforest(teste1.sku), 
                            xmlforest(teste1.quantidade),
                            xmlforest(teste1.unidmanejo),
                            xmlforest(teste1.deposito),
                            xmlforest(teste1.tipoestoque),
                             xmlelement("Lotes",
                                xmlelement("Lote",
                                xmlforest(teste1.numlote),
                                xmlforest(teste1.qtdlote)
               )
                )
                 )
                  )
                   )
                      )
                      )
                            )
  from custom_xml teste1;

 

Rodando via select o resultado é o correto, porém quando tento inserir o retorno em uma variavel clob, para a geração do arquivo, ele gera o seguinte erro:

<?xml version = '1.0'?>
<ERROR>oracle.xml.sql.OracleXMLSQLException: ORA-00911: caractere inválido
</ERROR>

 

Alguém sabe oque pode ser?
Em abaixo, segue o código que estou usando:

create or replace procedure gerar_xml is

  v_file Utl_File.File_Type;
  v_xml  CLOB;

BEGIN
  DECLARE
  
    v_file Utl_File.File_Type;
    v_xml  CLOB;
    v_more BOOLEAN := TRUE;
  
  BEGIN
   v_xml:= DBMS_XMLQUERY.getXML('select xmlelement("Confirmacaoseparacao", 
                  xmlforest(teste1.clmcl,
                            teste1.codfilial,
                            teste1.dtcriacao,
                            teste1.atualizacao ),
                            xmlelement("OrdemCarga",
                            xmlforest(teste1.NumDoctoTrans),
                            xmlforest(teste1.NumOrdemCarga),
                            xmlforest(teste1.CodLocalSaida),
                            xmlforest(teste1.CodTransportadora),
                            xmlforest(teste1.NumRomaneio),
                            xmlforest(teste1.placaveiculo),
                xmlelement("Remessas",
                    xmlelement("Remessa",
                       xmlforest(teste1.numremessa),
                          xmlelement("Itens",
                            xmlelement("Item",
                            xmlforest(teste1.numlinha),
                            xmlforest(teste1.sku), 
                            xmlforest(teste1.quantidade),
                            xmlforest(teste1.unidmanejo),
                            xmlforest(teste1.deposito),
                            xmlforest(teste1.tipoestoque),
                             xmlelement("Lotes",
                                xmlelement("Lote",
                                xmlforest(teste1.numlote),
                                xmlforest(teste1.qtdlote)
               )
                )
                 )
                  )
                   )
                      )
                      )
                            )
  from custom_xml teste1;');

    V_FILE := UTL_FILE.fopen('C_RECEIVED_FILES', 'TESTE.XML', 'w');
  
    WHILE V_MORE LOOP
      UTL_FILE.PUT(V_FILE, SUBSTR(V_XML, 1, 32767));
    
      IF LENGTH(V_XML) > 32767 THEN
        V_XML := SUBSTR(V_XML, 32768);
      ELSE
        V_MORE := FALSE;
      END IF;
    END LOOP;
  
    UTL_FILE.fclose(V_FILE);
  
  EXCEPTION
    
    WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(Substr(SQLERRM, 1, 255));
      Utl_File.FClose(v_file);
    
  END;

END;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.