- Este tópico contém 6 respostas, 3 vozes e foi atualizado pela última vez 16 anos, 3 meses atrás por
rwarstat.
-
AutorPosts
-
10 de dezembro de 2009 às 11:11 pm #91485
rwarstat
ParticipantePessoal,
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,
Roberto11 de dezembro de 2009 às 6:00 pm #91496marlontk
ParticipanteEu 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;11 de dezembro de 2009 às 7:52 pm #91505rwarstat
ParticipanteFiz 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 abaixoError 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 ignoredSe 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,
Roberto11 de dezembro de 2009 às 8:34 pm #91506fsitja
ParticipanteConforme 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);
11 de dezembro de 2009 às 8:54 pm #91507rwarstat
ParticipantePutz, 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 ignoredAbraço,
Roberto11 de dezembro de 2009 às 9:32 pm #91508fsitja
ParticipanteDois T’s: CONVERTTOBLOB
11 de dezembro de 2009 às 9:50 pm #91509rwarstat
ParticipantePior 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 -
AutorPosts
- Você deve fazer login para responder a este tópico.