Pular para o conteúdo
  • Este tópico contém 7 respostas, 2 vozes e foi atualizado pela última vez 10 anos, 8 meses atrás por Avatar de Sulimar ArseSulimar Arse.
Visualizando 8 posts - 1 até 8 (de 8 do total)
  • Autor
    Posts
  • #106393
    Avatar de Sulimar ArseSulimar Arse
    Participante

      Olá pessoal sou novo neste fórum, é minha primeira participação!

      Já consegui gerar o XML a partir de uma query, preciso saber como gerar trocando as tags por , pois fin_pagamento é o nome da base de onde estou extraindo os dados, assim eu terei um script que gera automaticamente o nome das tags.


      1
      A VISTA
      A


      2
      À PRAZO
      P

      Segue o script que gera o XML acima:

      SELECT value(tpg).getCLOBVal() AS “XMLTYPE”
      FROM table(XMLSequence(Cursor(SELECT CDTIPOPAGTO CODIGO_TIPO_PAGTO
      ,LTRIM(RTRIM(SUBSTR(NOTIPOPAGTO,1,25))) DESC_TIPO_PAGTO
      ,DECODE(FIN_TIPOPAGTO.FLGCONDPAGTO, ‘N’,’A’,’P’) TIPO_FORMA_PAGTO
      FROM FIN_TIPOPAGTO))) tpg;

      #106394
      Avatar de rmanrman
      Participante

        @Sulimar Arse

        Utilizando 2 REPLACE temos a solução:


        SELECT REPLACE(REPLACE(value(tpg).getCLOBVal(),'',''),'','') AS "XMLTYPE"
        FROM table(XMLSequence(Cursor(SELECT CDTIPOPAGTO CODIGO_TIPO_PAGTO
        ,LTRIM(RTRIM(SUBSTR(NOTIPOPAGTO,1,25))) DESC_TIPO_PAGTO
        ,DECODE(FIN_TIPOPAGTO.FLGCONDPAGTO, 'N','A','P') TIPO_FORMA_PAGTO
        FROM FIN_TIPOPAGTO))) tpg;

        #106403
        Avatar de Sulimar ArseSulimar Arse
        Participante

          Obrigado pela atenção! Consegui resolver a questão com o Replace. 🙂

          Agora estou com um ÚNICO problema para resolver:

          Quando executo uma proc com o código abaixo gera o arquivo texto desejado com TODOS OS REGISTROS colocados no cursor. Mas usando a mesma estrutura para gerar um cadastro de produtos, corta o arquivo conforme em anexo, alguma dica do que pode estar ocorrendo?

          Rodando somente o SELECT DO CURSOR de produtos, mostra todos os registros, mas rodando a procedure pelo PL/SQL ou pelo TOAD, gera o arquivo produtos.txt faltando linhas conforme em anexo (NÃO GERA TODOS OS REGISTROS).

          ----------------------------------------------------------------------
          DBMS_OUTPUT.PUT_LINE ('=====> Gerar o arquivo de FORMAS DE PAGAMENTO ');
          ----------------------------------------------------------------------    
          ExpFileName := 'pagamento.txt';
          --
          ExpFilePath := pPathArq;
          
          --
          IF NOT sys.UTL_FILE.IS_OPEN (ExpFile) THEN
              --
              ExpFile := sys.UTL_FILE.FOPEN (ExpFilePath, ExpFileName, 'w',9999);
              --
          

          END IF;

          sys.UTL_FILE.PUT_LINE (ExpFile, '');
          sys.UTL_FILE.PUT_LINE (ExpFile, ''); 
          --
          --
          FOR rPagamento IN cPagamento LOOP
              --                                      
              sys.UTL_FILE.PUT (ExpFile, REPLACE(rPagamento.XMLTYPE,'ROW','PAGAMENTO'));  
              --
          END LOOP;
          
          sys.UTL_FILE.PUT (ExpFile, '');
          --                                              
          --
          IF sys.UTL_FILE.IS_OPEN (ExpFile) THEN
             sys.UTL_FILE.FFLUSH (ExpFile);
             sys.UTL_FILE.FCLOSE (ExpFile);
          END IF;
          

          Arquivo texto gerado completo!

          Arquivo texto gerado INCOMPLETO!

          Attachments:
          #106405
          Avatar de rmanrman
          Participante

            @Sulimar Arse

            Poste a procedure completa do produto por favor.

            #106407
            Avatar de Sulimar ArseSulimar Arse
            Participante

              Pessoal, alguma dica do que poderia estar causando a geração incompleta do arquivo produtos.txt, a estrutura para gerar o arquivo é idêntica a que descrevi acima, a qual gera TODO o arquivo pagamento.txt. Não é o limite de arquivo, pois não chega nem a 1000 linhas.

              #106409
              Avatar de Sulimar ArseSulimar Arse
              Participante

                Segue o arquivo completo, conforme solicitado, a parte que interessa é o cursor cProduto e a rotina “Gerar o arquivo de PRODUTO”. Talvez possam visualizar algo que esteja impedindo de gerar todos os registros no arquivo.

                Reforçando: Executando somente o select que monta o cursor são listados normalmente 403 registros, mas quando gera o a arquivo texto (XML)corta o arquivo conforme enviado anteriormente.

                Obrigado pela atenção dispensada até o momento.

                #106410
                Avatar de rmanrman
                Participante

                  @Sulimar Arse


                  FOPEN Function

                  Syntax

                  UTL_FILE.FOPEN (
                  location IN VARCHAR2,
                  filename IN VARCHAR2,
                  open_mode IN VARCHAR2,
                  max_linesize IN BINARY_INTEGER DEFAULT 1024)
                  RETURN FILE_TYPE;

                  max_linesize: Maximum number of characters for each line, including the newline character, for this file (minimum value 1, maximum value 32767). If unspecified, Oracle supplies a default value of 1024.

                  Primeiro aumente o max_linesize para o máximo, ou seja, 32767.


                  PUT Procedure

                  Syntax

                  UTL_FILE.PUT (
                  file IN FILE_TYPE,
                  buffer IN VARCHAR2);

                  Usage Notes

                  The maximum size of the buffer parameter is 32767 bytes unless you specify a smaller size in FOPEN. If unspecified, Oracle supplies a default value of 1024. The sum of all sequential PUT calls cannot exceed 32767 without intermediate buffer flushes.

                  Existe um nota para a PROCEDURE PUT. Resumindo você não pode encher o buffer sem antes descarrega-lo em disco, para isso utilize a PROCEDURE FFLUSH.


                  FFLUSH Procedure

                  FFLUSH physically writes pending data to the file identified by the file handle. Normally, data being written to a file is buffered. The FFLUSH procedure forces the buffered data to be written to the file. The data must be terminated with a newline character.

                  Flushing is useful when the file must be read while still open. For example, debugging messages can be flushed to the file so that they can be read immediately.

                  Syntax

                  UTL_FILE.FFLUSH (
                  file IN FILE_TYPE);

                  Os dados descarregados pelo FFLUSH devem ser terminados por NEWLINE, utilize a PROCEDURE NEW_LINE.


                  NEW_LINE Procedure

                  This procedure writes one or more line terminators to the file identified by the input file handle. This procedure is separate from PUT because the line terminator is a platform-specific character or sequence of characters.

                  Syntax

                  UTL_FILE.NEW_LINE (
                  file IN FILE_TYPE,
                  lines IN BINARY_INTEGER := 1);

                  Segue a documentação oficial de UTL_FILE:

                  docs.oracle.com/cd/E11882_01/appdev.112/e40758/u_file.htm

                  #106420
                  Avatar de Sulimar ArseSulimar Arse
                  Participante

                    Pessoal,
                    Gostaria muito de agradecer a vocês!
                    Com o uso do UTL_FILE.FFLUSH consegui resolver o problema. espero que a rotina sirva de exemplo para outros usuários.

                    Grande abraço!

                    FOR rDuplicata IN cDuplicata LOOP

                    sys.UTL_FILE.PUT (ExpFile, REPLACE(rDuplicata.XMLTYPE,’ROW’,’DUPLICATA’));
                    sys.UTL_FILE.FFLUSH (ExpFile);

                    END LOOP;

                  Visualizando 8 posts - 1 até 8 (de 8 do total)
                  • Você deve fazer login para responder a este tópico.
                  plugins premium WordPress