WORKING WITH BFILE

Neste post irei demonstrar um exemplo de uso de um external LOB, o BFILE. Como já foi dito em post anteriores, um external LOB, o conteúdo dessa coluna não é armazenado em um datafile, mas reside no file system do S.O..  A coluna armazena apenas o locator para o arquivo físico, desta maneira, um BFILE não participa em transações, o seu conteúdo não poderá ser alterado, apenas o locator da coluna para outro arquivo.

Antes de se trabalhar com colunas do tipo BFILE, teremos que criar um objeto DIRECTORY que é o caminho onde estão os arquivos no SO. A segurança ficará por conta do DBA de dar privilégios apenas de READ por exemplo para os usuários, além de assegurar que ninguém poderá alterar no file system também, configurando corretamente as permissões no Linux por exemplo.


conn / as sysdba

GRANT CREATE DIRECTORY TO TERCIO;

exit

conn tercio/oraclepress

CREATE DIRECTORY bfiles AS '/tmp';

CREATE TABLE tercio.bfile_teste(
  bfile_id       NUMBER,
  arquivo_binary BFILE
);

CREATE TABLE tercio.clob_teste(
  bfile_id NUMBER,
  col_clob CLOB
);

INSERT INTO tercio.bfile_teste VALUES(1,BFILENAME('BFILES','teste.txt'));

DECLARE

v_bfile BFILE;
v_tamanho INTEGER;
v_raw RAW(60);
v_clob CLOB;
--VARIAVEIS ABAIXO APENAS PARA INSERI NO CLOB
v_message_erro INTEGER;
v_dest_offset NUMBER := 1;
v_src_offset NUMBER := 1;
v_lang_context INTEGER := DBMS_LOB.DEFAULT_LANG_CTX;

BEGIN

SELECT bf.arquivo_binary
INTO v_bfile
FROM tercio.bfile_teste bf
WHERE bf.bfile_id = 1;

INSERT INTO tercio.clob_teste
VALUES (1,EMPTY_CLOB())
RETURN col_clob INTO v_clob;

DBMS_LOB.OPEN(v_bfile,DBMS_LOB.LOB_READONLY);

v_tamanho := DBMS_LOB.GETLENGTH(v_bfile);
DBMS_LOB.READ(v_bfile, v_tamanho, 1, v_raw);
DBMS_OUTPUT.PUT_LINE(UTL_RAW.CAST_TO_VARCHAR2(v_raw));

DBMS_LOB.LOADCLOBFROMFILE(v_clob,v_bfile,v_tamanho,v_dest_offset,v_src_offset,NLS_CHARSET_ID('US7ASCII'),v_lang_context,v_message_erro);
UPDATE tercio.clob_teste cl
SET cl.col_clob = v_clob
WHERE cl.bfile_id = 1;

DBMS_LOB.CLOSE(v_bfile);

END;

No exemplo acima o diretório foi criado onde existe um arquivo teste.txt. Conteúdo desse arquivo é a url do meu blog. Logo em seguida foi criada uma tabela com uma coluna do tipo BFILE e outra tabela com uma coluna do tipo CLOB. Ambas as tabelas serão utilizadas no exemplo.

Na primeira tabela foi inserido uma linha com a ajuda da função BFILENAME. Logo após existe um bloco anônimo onde iremos verificar o conteúdo da coluna e demonstrar como preencher uma outra tabela com o conteúdo de um arquivo físico(BFILE).

Neste bloco anônimo, no bloco declare, tem diversas variáveis que serão utilizadas, vamos explicar cada uma delas a seguir:

  • v_bfile –  variável do tipo BFILE, onde será utilizada para armazenar o conteúdo que foi inserido anteriormente e assim ser utilizado nos testes a seguir.
  • v_tamanho  – será utilizada para armazenar o tamanho do conteúdo do  BFILE.
  • v_raw – para ler o conteúdo do arquivo BFILE.
  • v_clob – CLOB utilizado para inserir na segunda tabela o conteúdo do BFILE.
  • v_message_erro – Variável OUT que indica se algo anormal aconteceu durante a leitura, que não foi o nosso caso do exemplo.
  • v_dest_offset – OFFSET que irá iniciar a escrever no CLOB de destino
  • v_src_offset – OFFSET para começar a ler do CLOB de origem.

v_lang_context – Language Context da leitura atual, e essa variável também será do tipo OUT indicando qual o Language Context quando parou a leitura e qual será utilizado caso continue lendo da mesma origem.

No início do bloco BEGIN é feito um select da coluna da tabela na variável BFILE. Logo após é inserido um registro na tabela clob_teste que tem uma coluna do tipo CLOB. Foi utilizado a variável v_clob para armazenar o locator do conteúdo.

Foi aberto o BFILE e logo após foi verificado o tamnao do mesmo e assim conteúdo do BFILE foi colado na variável v_raw com a procedure READ, indicando que a leitura começa da posição 1 e vai até o tamanho do total do BFILE(v_tamanho). Para efeitos de teste, o resultado que ficou armazenado na variável v_raw é impresso na tela via DBMS_OUTPUT.

Após isto, vamos inserir o conteúdo do BFILE em uma coluna CLOB, mas um processo similar poderia ser realizado para uma coluna do tipo BLOB.

Foi utilizada a procedure LOADCLOBFROMFILE da package DBMS_LOB. Poderia ser utilizada a função LOADFROMFILE que tem bem menos parâmetros e mais simples de ser utilizada, mas poderia resultar em problemas de charsets.

Todos os parâmetros foram explicados anteriormente, com exceção de um, o parâmetro bfile_csid que foi colocado o valor NLS_CHARSET_ID(‘US7ASCII’). Esse parâmetro indica o charset, ou character set ID, do BFILE  de origem.

Para finalizar, atualizamos o registro anteriormente inserido, mas desta vez com o conteúdo do BFILE, utilizando a variável v_clob.

Anúncios

Meu nome é Tércio Costa, sou formado em Ciências da Computação pela UFPB, tenho a certificação Oracle SQL Expert, mantendo um blog reconhecido pela OTN(oraclepress.wordpress.com), no qual também publico artigos técnicos no portal OTN, no portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine. Além de tudo isto sou um Oracle ACE Associate por estar sempre contribuindo para a comunidade com um bom nível de expertise.

Marcado com: , , , ,
Publicado em Sem categoria

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Esse Blog é reconhecido pela
Certificações
Sou articulista
Sou articulista

Clique para seguir este blog e receber notificações via email de novos posts.

Tércio Costa

Tércio Costa

Meu nome é Tércio Costa, sou formado em Ciências da Computação pela UFPB, tenho a certificação Oracle SQL Expert, mantendo um blog reconhecido pela OTN(oraclepress.wordpress.com), no qual também publico artigos técnicos no portal OTN, no portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine. Além de tudo isto sou um Oracle ACE Associate por estar sempre contribuindo para a comunidade com um bom nível de expertise.

Links Pessoais

Serviços verificados

Visualizar Perfil Completo →

Total de Visualizações da Página
  • 96.671 Visualizações
%d blogueiros gostam disto: