› Fóruns › SQL e PL/SQL › Erro PLS-00215 › Responder a: Erro PLS-00215
“entao tentei carregar o arquivo com o loadclobfromfile e pedir para ler usando o read e usar o writeappend para dividir o arquivo em parte e gravar dentro do bd.”
REPITO, pela 3ª vez, que É a da sorte : vc ABSOLUTAMENTE NÂO PRECISA DIVIDIR um arquivo para que tenha TODOS OS DADOS DELE carregados para dentro de uma coluna LOB – o LOB permite SIM que vc grave (numa só coluna de uma só linha!!) até 4 GB de dados – vc só precisaria Dividir o XML em múltiplos pedaços SE não fosse isso, tipo : sua app tem, em memória, um XML grande, que não está em arquivo, aí TANTO na linguagem SQL quanto na linguagem PL/SQL existem LIMITES para tamanho de strings que vc pode colocar num INSERT, cfrme o meu artigo mostra – NÃO FAZ SENTIDO vc queuer dividir o LOB se os dados Já Estão num arquivo. o LOADFROMFILE CONSEGUE LER TUDO NUMA PANCADA Só…
No frigir dos ovos : SE os dados estão num arquivo-texto Acessível ao database OK, usa o LOADFROMFILE e com isso vc BYPASSOU os limites do comando INSERT que meu artigo mostra, falows ?
Vamos a um exemplo – o usuário SCOTT já recebeu GRANTs de READ e de WRITE no directory DATA_PUMP_DIR, que aponta para C:\app\oracle\product\21c\admin\XE\dpdump\32E2E310D29D4EC99CB01153313047B4 , e lá eu TENHO um arquivo de texto, com MAIS de 32 KB, que chamei de texto_longo.txt :
C:\app\oracle\product\21c\admin\XE\dpdump\32E2E310D29D4EC99CB01153313047B4>dir text*.txt
O volume na unidade C é Acer
O Número de Série do Volume é 2C56-9CDD
Pasta de C:\app\oracle\product\21c\admin\XE\dpdump\32E2E310D29D4EC99CB01153313047B4
03/10/2024 16:39 34.220 texto_longo.txt
1 arquivo(s) 34.220 bytes
0 pasta(s) 12.750.139.392 bytes disponíveis
C:\app\oracle\product\21c\admin\XE\dpdump\32E2E310D29D4EC99CB01153313047B4>
==> quero carregar o conteúdo desse arquivo NA ÍNTEGRA, para uma coluna CLOB : para poder rodar o teste, crio uma tabela com coluna CLOB :
SCOTT@XEPDB1::CONT=XEPDB1> create table TB_TESTE_CLOB(c1 number, c2 clob);
trigger disparada
Tabela criada.
=> e insiro uma LINHA na tabela, vai ser na coluna CLOB ** dessa linha ** que quero carregar o conteúdo INTEIRO do arquivo-texto :
==> pronto, tenho uma massa de dados, agora é só executar o bloco PL/SQL que te passei, só ALTERANDO os nomes, óbvio.. Adicionalmente, meu banco de testes é um XE 21c, então COMO EU TINHA DITO ANTES, em versões mais recentes a ORACLE RECOMENDA usar o LOADxxxFROMFILE, onde xxx é o tipo de LOB…
Eis o exemplo :
SCOTT@XEPDB1::CONT=XEPDB1> DECLARE
2 v_lob clob;
3 l_bfile bfile;
4 v_qtd_bytes number;
5 --
6 l_dest_offset integer := 1;
7 l_src_offset integer := 1;
8 l_bfile_csid number := 0;
9 l_lang_context integer := 0;
10 l_warning integer := 0;
11 BEGIN
12 l_bfile := bfilename( 'DATA_PUMP_DIR', 'texto_longo.txt');
13 v_qtd_bytes := dbms_lob.getlength( l_bfile );
14 dbms_lob.fileopen( l_bfile ,dbms_lob.file_readonly);
15 -- crio uma linha na tabela com CLOB vazio, E guardo o ponteiro para esse CLOB, usarei no LOAD …
16 insert into TB_TESTE_CLOB (C1, C2) values (1, empty_clob() ) returning C2 into v_lob;
17
18 dbms_lob.loadclobfromfile (
19 dest_lob => v_lob,
20 src_bfile => l_bfile,
21 amount => v_qtd_bytes,
22 dest_offset => l_dest_offset,
23 src_offset => l_src_offset,
24 bfile_csid => l_bfile_csid ,
25 lang_context => l_lang_context,
26 warning => l_warning
27 );
28 --
29 dbms_output.put_line('Tamanho do arquivo é:'||dbms_lob.getlength( l_bfile ));
30 dbms_output.put_line('Bytes lidos e gravados=' ||dbms_lob.getlength(v_lob));
31 dbms_lob.fileclose( l_bfile );
32 commit;
33 END;
34 /
Tamanho do arquivo é:34220
Bytes lidos e gravados=34218
Procedimento PL/SQL concluído com sucesso.
=> para COMPROVAR que os dados do arquivo INTEIRO ** FORAM LIDOS E CARREGADOS ** (absolutamente SEM PRECISAR dessa lógica de ‘separação’ !!!), vou configurar o sqlplus para exibir os dados Todos :
SCOTT@XEPDB1::CONT=XEPDB1> set LONG 500000
=> claro, para não ocupar espaço aqui no Fórum, vou CORTAR a string, mas acredite, exibiu os dados do arquivo INTEIRINHO :
SCOTT@XEPDB1::CONT=XEPDB1> select * from TB_TESTE_CLOB;
C1 C2
———- ——————————————————————————–
1 Texto com MAIS de 32767 caracteres por¿com MENOS de 4 GB, terminado com ! : Lore
m ipsum dolor sit amet, consectetuer adipiscing elit
…. blablabla, montes de dados cortados…. Phasellus
gravida semper nisi. Nullam vel sem. Pellentesque libero tortor, tincidunt et,
tincidunt eget, semper nec, quam.!
SCOTT@XEPDB1::CONT=XEPDB1>
CERTINHO ????