.comment-link {margin-left:.6em;}

Tuesday, April 10, 2007

DBMS_LOB (10g)

Na lista de discussão oracle_br, tivemos um dúvida relacionada ao uso do LOB. Era preciso descarregar o conteúdo de um campo CLOB em um arquivo, porém a longitude do registro era maior que 32767 (limite documentado do utl_file). Depois de algum bate-bola, chegamos a conclusão que era possível usar o dbms_lob.put_raw para escrever tal linha. Faltou o exemplo e aqui está ele.

ops$marcio:LX10G> create table t ( x clob );

Table created.

ops$marcio:LX10G>
ops$marcio:LX10G> create or replace directory my_files as '/tmp';

Directory created.

ops$marcio:LX10G>
ops$marcio:LX10G> declare
2 l_clob clob;
3 begin
4 loop
5 exit when dbms_lob.getlength( l_clob ) > 50000;
6 l_clob := l_clob || rpad('z', 32760, 'x') ;
7 end loop;
8
9 insert into t values ( l_clob ) ;
10 end;
11 /

PL/SQL procedure successfully completed.

ops$marcio:LX10G>
ops$marcio:LX10G> select dbms_lob.getlength( x ) from t;

DBMS_LOB.GETLENGTH(X)
---------------------
65520

1 row selected.

ops$marcio:LX10G>
ops$marcio:LX10G> declare
2 l_output utl_file.file_type;
3 l_blob blob;
4 l_clob clob;
5 l_amt number default 32000;
6 l_off number default 1;
7 l_raw raw(32000);
8 l_length number;
9
10 l_warning number;
11 l_doff7 number default 1;
12 l_soff7 number default 1;
13 l_lang_ctx number default dbms_lob.default_lang_ctx;
14
15 begin
16 l_output := utl_file.fopen( 'MY_FILES', 'bigclob.txt', 'wb', 32767 );
17 select x into l_clob from t;
18
19 dbms_lob.createtemporary( l_blob, true, dbms_lob.session );
20
21 dbms_lob.converttoblob(
22 l_blob,
23 l_clob,
24 dbms_lob.LOBMAXSIZE,
25 l_doff7,
26 l_soff7,
27 dbms_lob.DEFAULT_CSID,
28 l_lang_ctx,
29 l_warning
30 );
31
32 l_length := dbms_lob.getlength(l_blob);
33 loop
34 exit when l_off > l_length;
35 dbms_lob.read( l_blob, l_amt, l_off, l_raw );
36 l_off := l_off + l_amt;
37 utl_file.put_raw( l_output, l_raw, true );
38 end loop;
39
40 utl_file.fclose( l_output );
41 dbms_lob.freetemporary( l_blob );
42 end;
43 /

PL/SQL procedure successfully completed.

ops$marcio:LX10G>
ops$marcio:LX10G> !ls -l /tmp/bigclob.txt
-rw-r--r-- 1 oracle dba 65520 Apr 10 10:28 /tmp/bigclob.txt

ops$marcio:LX10G> !wc -L /tmp/bigclob.txt
65520 /tmp/bigclob.txt

Labels:


Comments: Post a Comment



<< Home

This page is powered by Blogger. Isn't yours?