Pular para o conteúdo
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #91485
    rwarstat
    Participante

      Pessoal,
      Estou precisando carregar um campo BLOB com um arquivo rtf que vai ser gerado com informações do banco. Ou seja, tenho o modelo do rtf e preciso subistituir algumas coisas por infromações que irei pegar do banco e salvar isso em um campo blob.
      Alguém tem alguma sugestão de como fazer isso?

      Abraço,
      Roberto

      #91496
      marlontk
      Participante

        Eu tenho aqui na empresa um procedimento que eu passo que pode carregar um CLOB(que na verdade transforma para XMLTYpe devido a NFe)
        que acredito ser parecido com que tu procura..

        CREATE OR REPLACE PROCEDURE load_xml (p_dir IN VARCHAR2,
        p_filename IN VARCHAR2) AS
        l_bfile BFILE := BFILENAME(p_dir, p_filename);
        l_clob CLOB;
        BEGIN
        DBMS_LOB.createtemporary (l_clob, TRUE);
        DBMS_LOB.fileopen(l_bfile, DBMS_LOB.file_readonly);
        DBMS_LOB.loadfromfile(l_clob, l_bfile, DBMS_LOB.getlength(l_bfile));
        DBMS_LOB.fileclose(l_bfile);
        — INSERT INTO xml_tab (
        — id,
        — filename,
        — xml
        — )
        — VALUES (
        — xml_tab_seq.NEXTVAL,
        — p_filename,
        — XMLTYPE.createXML(l_clob)
        — );
        COMMIT;
        DBMS_LOB.freetemporary (l_clob);
        END;

        #91505
        rwarstat
        Participante

          Fiz o código abaixo e acho que ele deva funcionar a contento. A função dele é gerar um rtf com algumas informações vindas do banco e gravar em um campo blob.
          O problema é que toda vez que vou executar aparece o erro abaixo

          Error at line 2
          ORA-06550: line 102, column 7:
          PLS-00221: 'GETLENGTH' is not a procedure or is undefined
          ORA-06550: line 102, column 7:
          PL/SQL: Statement ignored

          Se eu executar o dbms_lob.getlength em um select ele funciona que é uma maravilha.

          DECLARE
          v_assinatura VARCHAR2 (4000);
          v_c_assinatura CLOB;
          v_b_assinatura BLOB;
          v_amount PLS_INTEGER;
          v_lang_context NUMBER := DBMS_LOB.default_lang_ctx;
          v_warning NUMBER;
          BEGIN
          FOR cur_medico IN (SELECT cd_medico, cd_conselho, nr_crm, nm_medico
          FROM medico
          WHERE in_ativo = 'S' AND cd_medico = 3)
          LOOP
          UPDATE medico
          SET in_utiliza_assinat = 'S'
          WHERE cd_medico = cur_medico.cd_medico;

            v_assinatura :=
                  '{rtf1ansideff0deftab720{fonttbl{f0fnilfcharset0 Arial;}{f1fnilfcharset0 Arial;}{f2fnilfcharset2 WingDings;}}{colortblred0green0blue0;red255green0blue0;red0green128blue0;red0green0blue255;red255green255blue0;red255green0blue255;red128green0blue128;red128green0blue0;red0green255blue0;red0green255blue255;red0green128blue128;red0green0blue128;red255green255blue255;red192green192blue192;red128green128blue128;red0green0blue0;}wpprheadfoot1paperw11906paperh16838margl1500margr1500margt1000margb1000headery720footery720{*listtable{listlisttemplateid19690212{listlevelleveljc0levelfollow0levelstartat1levelspace0levelindent360levelnfc1{leveltext'
               || CHR (39)
               || '02'
               || CHR (39)
               || '00.;}{levelnumbers'
               || CHR (39)
               || '01;}}'
               || '{listlevelleveljc0levelfollow0levelstartat1levelspace0levelindent360levelnfc3{leveltext'
               || CHR (39)
               || '02'
               || CHR (39)
               || '01.;}{levelnumbers'
               || CHR (39)
               || '01;}}'
               || '{listlevelleveljc0levelfollow0levelstartat1levelspace0levelindent360levelnfc0{leveltext'
               || CHR (39)
               || '02'
               || CHR (39)
               || '02.;}{levelnumbers'
               || CHR (39)
               || '01;}}'
               || '{listlevelleveljc0levelfollow0levelstartat1levelspace0levelindent360levelnfc4{leveltext'
               || CHR (39)
               || '02'
               || CHR (39)
               || '03.;}{levelnumbers'
               || CHR (39)
               || '01;}}'
               || '{listlevelleveljc0levelfollow0levelstartat1levelspace0levelindent360levelnfc2{leveltext'
               || CHR (39)
               || '02'
               || CHR (39)
               || '04.;}{levelnumbers'
               || CHR (39)
               || '01;}}'
               || '{listlevelleveljc0levelfollow0levelstartat1levelspace0levelindent360levelnfc4{leveltext'
               || CHR (39)
               || '02'
               || CHR (39)
               || '05.;}{levelnumbers'
               || CHR (39)
               || '01;}}'
               || '{listlevelleveljc0levelfollow0levelstartat1levelspace0levelindent360levelnfc0{leveltext'
               || CHR (39)
               || '02'
               || CHR (39)
               || '06.;}{levelnumbers'
               || CHR (39)
               || '01;}}'
               || '{listlevelleveljc0levelfollow0levelstartat1levelspace0levelindent360levelnfc0{leveltext'
               || CHR (39)
               || '02'
               || CHR (39)
               || '07.;}{levelnumbers'
               || CHR (39)
               || '01;}}'
               || '{listlevelleveljc0levelfollow0levelstartat1levelspace0levelindent360levelnfc0{leveltext'
               || CHR (39)
               || '02'
               || CHR (39)
               || '08.;}{levelnumbers'
               || CHR (39)
               || '01;}}'
               || 'listid1194737}}{*listoverridetable{listoverridelistid1194737listoverridecount0ls1}}endnheresectdefaultcl{pard{qlli0fi0ri0sb0slsa0 plainf1fs24cf0b ';
            v_assinatura :=
                  v_assinatura
               || cur_medico.nm_medico
               || 'par'
               || 'qlli0fi0ri0sb0slsa0 plainf1fs24cf0b '
               || cur_medico.cd_conselho
               || ': '
               || cur_medico.nr_crm
               || 'par'
               || 'qlli0fi0ri0sb0slsa0 plainf1fs24cf0b }}'
               || '}';
            DBMS_OUTPUT.put_line (v_assinatura);
          
            INSERT INTO medico_assinatura
                        (cd_medico, assinatura
                        )
                 VALUES (3, EMPTY_BLOB
                        );
          
            COMMIT;
            v_c_assinatura := v_assinatura;
            DBMS_LOB.getlength (v_c_assinatura);
            DBMS_LOB.convertoblob (v_b_assinatura,
                                   v_c_assinatura,
                                   v_amount,
                                   1,
                                   1,
                                   v_lang_context,
                                   v_warning
                                  );
            DBMS_OUTPUT.put_line (v_warning);
          
            UPDATE medico_assinatura
               SET assinatura = v_b_assinatura
             WHERE cd_medico = 3;
          
            COMMIT;
          

          END LOOP;
          END;

          Abraço,
          Roberto

          #91506
          fsitja
          Participante

            Conforme diz a mensagem, DBMS_LOB.GETLENGTH é uma function e, portanto, retorna um valor; não pode ser chamada “solta”. É necessário atribuir o valor a alguma variável.


            variavel_comprimento := DBMS_LOB.getlength (v_c_assinatura);

            #91507
            rwarstat
            Participante

              Putz, baita rateada a minha. rsrsrs
              Pior que fiquei batendo cabeça nesse negócio e não percebi isso.

              Resolvido isso estou com um outro problema.
              No mesmo código tá acusando que o convertoblob deve ser declarado. Ao menos acho que fiz certo.

              A mensagem é:

              Error at line 2
              ORA-06550: line 105, column 16:
              PLS-00302: component 'CONVERTOBLOB' must be declared
              ORA-06550: line 105, column 7:
              PL/SQL: Statement ignored

              Abraço,
              Roberto

              #91508
              fsitja
              Participante

                Dois T’s: CONVERTTOBLOB

                #91509
                rwarstat
                Participante

                  Pior que vi isso depois.
                  Tava me baseado na sintaxe que estava em um site.

                  Depois de muito quebrar a cabeça, consegui fazer o meu código funcionar.
                  Vou colocar ele aí para caso alguém precise criar um rtf e salvar em um blob no banco sem salvar no disco antes.

                  DECLARE
                  v_assinatura VARCHAR2 (4000);
                  v_c_assinatura CLOB;
                  v_b_assinatura BLOB;
                  v_amount PLS_INTEGER;
                  v_lang_context NUMBER := DBMS_LOB.default_lang_ctx;
                  v_warning NUMBER;
                  v_blob_offset NUMBER;
                  v_clob_offset NUMBER;
                  BEGIN
                  FOR cur_medico IN (SELECT cd_medico, cd_conselho, nr_crm, nm_medico
                  FROM medico
                  WHERE in_ativo = 'S' AND cd_medico 1)
                  LOOP
                  UPDATE medico
                  SET in_utiliza_assinat = 'S'
                  WHERE cd_medico = cur_medico.cd_medico;

                    v_assinatura :=
                          '{rtf1ansideff0deftab720{fonttbl{f0fnilfcharset0 Arial;}{f1fnilfcharset0 Arial;}{f2fnilfcharset2 WingDings;}}{colortblred0green0blue0;red255green0blue0;red0green128blue0;red0green0blue255;red255green255blue0;red255green0blue255;red128green0blue128;red128green0blue0;red0green255blue0;red0green255blue255;red0green128blue128;red0green0blue128;red255green255blue255;red192green192blue192;red128green128blue128;red0green0blue0;}wpprheadfoot1paperw11906paperh16838margl1500margr1500margt1000margb1000headery720footery720{*listtable{listlisttemplateid19690212{listlevelleveljc0levelfollow0levelstartat1levelspace0levelindent360levelnfc1{leveltext'
                       || CHR (39)
                       || '02'
                       || CHR (39)
                       || '00.;}{levelnumbers'
                       || CHR (39)
                       || '01;}}'
                       || '{listlevelleveljc0levelfollow0levelstartat1levelspace0levelindent360levelnfc3{leveltext'
                       || CHR (39)
                       || '02'
                       || CHR (39)
                       || '01.;}{levelnumbers'
                       || CHR (39)
                       || '01;}}'
                       || '{listlevelleveljc0levelfollow0levelstartat1levelspace0levelindent360levelnfc0{leveltext'
                       || CHR (39)
                       || '02'
                       || CHR (39)
                       || '02.;}{levelnumbers'
                       || CHR (39)
                       || '01;}}'
                       || '{listlevelleveljc0levelfollow0levelstartat1levelspace0levelindent360levelnfc4{leveltext'
                       || CHR (39)
                       || '02'
                       || CHR (39)
                       || '03.;}{levelnumbers'
                       || CHR (39)
                       || '01;}}'
                       || '{listlevelleveljc0levelfollow0levelstartat1levelspace0levelindent360levelnfc2{leveltext'
                       || CHR (39)
                       || '02'
                       || CHR (39)
                       || '04.;}{levelnumbers'
                       || CHR (39)
                       || '01;}}'
                       || '{listlevelleveljc0levelfollow0levelstartat1levelspace0levelindent360levelnfc4{leveltext'
                       || CHR (39)
                       || '02'
                       || CHR (39)
                       || '05.;}{levelnumbers'
                       || CHR (39)
                       || '01;}}'
                       || '{listlevelleveljc0levelfollow0levelstartat1levelspace0levelindent360levelnfc0{leveltext'
                       || CHR (39)
                       || '02'
                       || CHR (39)
                       || '06.;}{levelnumbers'
                       || CHR (39)
                       || '01;}}'
                       || '{listlevelleveljc0levelfollow0levelstartat1levelspace0levelindent360levelnfc0{leveltext'
                       || CHR (39)
                       || '02'
                       || CHR (39)
                       || '07.;}{levelnumbers'
                       || CHR (39)
                       || '01;}}'
                       || '{listlevelleveljc0levelfollow0levelstartat1levelspace0levelindent360levelnfc0{leveltext'
                       || CHR (39)
                       || '02'
                       || CHR (39)
                       || '08.;}{levelnumbers'
                       || CHR (39)
                       || '01;}}'
                       || 'listid1194737}}{*listoverridetable{listoverridelistid1194737listoverridecount0ls1}}endnheresectdefaultcl{pard{qlli0fi0ri0sb0slsa0 plainf1fs24cf0b '
                       || cur_medico.nm_medico
                       || 'par'
                       || 'qlli0fi0ri0sb0slsa0 plainf1fs24cf0b '
                       || cur_medico.cd_conselho
                       || ': '
                       || cur_medico.nr_crm
                       || 'par'
                       || 'qlli0fi0ri0sb0slsa0 plainf1fs24cf0b }}'
                       || '}';
                    DBMS_OUTPUT.put_line (v_assinatura);
                  
                    INSERT INTO medico_assinatura
                                (cd_medico, assinatura
                                )
                         VALUES (cur_medico.cd_medico, EMPTY_BLOB
                                );
                  
                    COMMIT;
                    v_c_assinatura := v_assinatura;
                    v_amount := DBMS_LOB.getlength (v_c_assinatura);
                    v_blob_offset := 1;
                    v_clob_offset := 1;
                  
                    SELECT     assinatura
                          INTO v_b_assinatura
                          FROM medico_assinatura
                         WHERE cd_medico = cur_medico.cd_medico
                    FOR UPDATE;
                  
                    DBMS_LOB.converttoblob (v_b_assinatura,
                                            v_c_assinatura,
                                            v_amount,
                                            v_blob_offset,
                                            v_clob_offset,
                                            1,
                                            v_lang_context,
                                            v_warning
                                           );
                    DBMS_OUTPUT.put_line (v_warning);
                  
                    UPDATE medico_assinatura
                       SET assinatura = v_b_assinatura
                     WHERE cd_medico = cur_medico.cd_medico;
                  
                    COMMIT;
                  

                  END LOOP;
                  END;

                  O rtf é bem simples, mas a idéia é essa.

                  Muito obrigado pela ajuda.

                  Abraço,
                  Roberto

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