Uma introdução ao LOBs – Large Objects

Com esse tipo de dado, podemos armazenar grandes arquivos, como textos, imagens, videos e áudios, tudo com até 128 terabytes de espaço! Temos 3 tipos: BLOB(Binary LOB), CLOB(Character LOB) e NCLOB (National Character LOB). Temos a opção também de armazenar fora do banco de dados estes tipos de arquivos, utilizando o BFILE, que armazena apenas a localização de onde se encontra este arquivo.

Ao se trabalhar com colunas do tipo LOBs, elas serão armazenadas separadamente do restante das colunas da tabela. Apenas a localização física que contem o arquivo é armazenada nos dando acesso a Private Work Area (SGA), nos dando a habilidade de ver o conteúdo e de também adicionar mais informações.

Temos algumas maneiras de se trabalhar com variáveis e/ou colunas do tipo LOBs, e elas se diferenciam do contexto em que se encontra, se é no contexto PL/SQL ou apenas SQL.

Sem utilizar nenhum package, o dbms_lob que veremos mais adiante, no contexto do PL/SQL podemos criar uma variável do tipo LOB com o valor null inicialmente, vazio ou então com algum valor, mas que seja menor do que 32.767 bytes. Veja um exemplo bastante simples abaixo:

DECLARE
  v_1 CLOB;
  v_2 CLOB := EMPTY_CLOB();
  v_3 CLOB := 'TESTE';
BEGIN
 null;
END;

Na linha 2 do código acima, criamos um CLOB sem inicializar, ou seja, seu valor é NULL. Na linha 3 é criada uma variável do tipo CLOB mas dessa vez ela é inicializada. E por último, na linha 4, criamos outra variável mas dessa vez inicializamos ela com uma string.

Mais uma vez, sem uso de package, só podemos trabalhar com CLOBs com um tamanho máximo de 32.767 bytes. O exemplo anterior nos mostra os possíveis 3 estados de um LOB. Ou seja, diferentemente dos outros tipos de dados, onde só tem dois possíveis estados que é NULL ou NOT NULL, o tipo LOB também adiciona o estado vazio(empty).

Para realizar operações de INSERT ou UPDATE em uma tabela que tenha uma coluna com o tipo de dado LOB, podemos inserir diretamente uma STRING com um tamanho menor do que 32.767 bytes(não é caracteres) ou então passar um empty_clob por exemplo. Outra solução seria criar uma função em que recebe um VARCHAR2 e retorna um CLOB por exemplo. Veja esses casos em prática no trecho de código abaixo:

CREATE TABLE tercio.testes_clob (
  ID    NUMBER,
  large CLOB
);

CREATE OR REPLACE FUNCTION tercio.return_clob(p_a VARCHAR2) RETURN CLOB IS
  v_a CLOB;
BEGIN
  dbms_lob.CREATETEMPORARY(v_a,FALSE,dbms_lob.CALL);
  dbms_lob.WRITE(v_a,LENGTH(p_a),1,p_a);  
  RETURN v_a;
END;

INSERT INTO tercio.testes_clob(ID,large) VALUES(1,'TESTE - Inicializando com um VARCHAR2');
INSERT INTO tercio.testes_clob(ID,large) VALUES(2,empty_clob());
INSERT INTO tercio.testes_clob(ID,large) VALUES(3,NULL);
INSERT INTO tercio.testes_clob(ID,large) VALUES(4,tercio.return_clob('TESTE com function'));

Primeiro foi criada uma tabela com uma coluna do tipo CLOB. Logo após foi criada uma function. Vamos analisar um pouco essa function. Na linha 7 do código foi declarada uma variável do tipo CLOB que não foi inicializada. Na linha 9 utilizamos a package dbms_lob com a procedure CREATETEMPORARY, em que recebe uma variável do tipo BLOB ou CLOB e assim irá criar um BLOB ou CLOB temporária e o seu index associado na tablespace default. Somente depois disto poderemos utilizar o CLOB como um “locator” válido. Para esta função, além da variável, também temos outros dois parâmetros. O segundo é se irá ler o LOb em questão no buffer cache ou não. E o terceiro, e último, é quando irá fazer a “limpeza” do lob, que tem dois possíveis valores, SESSION ou CALL(Constantes do package).

Logo após isso, na linha 10 escrito o conteúdo do parâmetro da função para a variável CLOB que é retornada no final da function. Os dois parâmetros do meio é a posição inicial e quantos bytes ou caracteres serão escritos no CLOB.

Vamos ver um exemplo agora de como podemos inserir dados maiores do que 32.767 bytes.

DECLARE
  v_a     CLOB;
  v_texto CHAR(32000) := 'teste';
BEGIN
  INSERT INTO tercio.testes_clob
  (ID,large)
  VALUES
  (13,EMPTY_CLOB())
  RETURN large INTO v_a;
  --
  dbms_lob.write(v_a,LENGTH(v_texto),1                      ,v_texto);
  dbms_lob.write(v_a,LENGTH(v_texto),dbms_lob.getlength(v_a),v_texto);
  dbms_lob.write(v_a,LENGTH(v_texto),dbms_lob.getlength(v_a),v_texto);
  dbms_lob.write(v_a,LENGTH(v_texto),dbms_lob.getlength(v_a),v_texto);
  --
  COMMIT;
END;

Logo no início do bloco BEGIN foi feito um INSERT na tabela com uma empty_clob() como já foi visto. Mas aqui temos um detalhe a mais. Foi utilizado a cláusula RETURNING INTO para a variável do tipo CLOB, assim essa variável será o locator e poderemos adicionar mais informações antes de executar o COMMIT. Para ilustrar isso, foi utilizado mais uma vez a função write, agora dessa vez utilizando o conteúdo da variável v_texto do tipo CHAR, pois queremos que o tamanho dessa variável seja bem grande(32k), mesmo sem ser utilizado. Dessa forma das linhas 11 a 14 foi inserido o conteúdo dessa variável no CLOB 4 vezes.

Perceba que o terceiro parâmetro da função utilizamos outra função do package dbms_lob, o getlength, retornando assim o tamanho do clob como a posição inicial a se escrever. No final disto tudo o tamanho do clob vai ser algo bem grande, algo que nunca iria caber em uma coluna VARCHAR2

Isso foi apenas uma breve introdução ao LOBs, iremos ver mais detalhes daqui pra frente no blog.

Anúncios

Formado em Ciências da Computação pela UFPB com experiência em Servidores Windows Server e Linux e banco de dados Oracle desde 2008 juntamente com os seus serviços. Desenvolvimento de Sistemas em Java SE com banco de dados Oracle e MySQL. Certificado Oracle Certified SQL Expert, mantendo o blog https://oraclepress.wordpress.com/ reconhecido pela OTN, articulista na OTN, portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine.

Marcado com: , , , , , ,
Publicado em PL/SQL

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 )

Imagem do Twitter

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

Foto do Facebook

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

Foto do Google+

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

Conectando a %s

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

Formado em Ciências da Computação pela UFPB com experiência em Servidores Windows Server e Linux e banco de dados Oracle desde 2008 juntamente com os seus serviços. Desenvolvimento de Sistemas em Java SE com banco de dados Oracle e MySQL. Certificado Oracle Certified SQL Expert, mantendo o blog https://oraclepress.wordpress.com/ reconhecido pela OTN, articulista na OTN, portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine.

Links Pessoais

Serviços verificados

Visualizar Perfil Completo →

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