# java.sql.Blob e java.sql.Clob

No JDBC 2.0, java.sql.Blob é o mapeamento para o tipo BLOB (objeto grande binário) do SQL; java.sql.Clob é o mapeamento para o tipo CLOB (objeto grande caractere) do SQL.

java.sql.Blob e java.sql.Clob fornecem um ponteiro lógico para um objeto grande, em vez de uma cópia completa do objeto. O Derby processa somente uma página de dados na memória por vez. Não há necessidade de processar e armazenar todo o BLOB em memória apenas para acessar alguns poucos bytes iniciais do objeto LOB

O Derby agora suporta os tipos de dado nativos BLOB e CLOB. O Derby também fornece o seguinte suporte para estes tipos de dado:

- Funcionalidades do BLOB O Derby suporta a interface java.sql.Blob, e os métodos relacionados ao BLOB em java.sql.PreparedStatement e java.sql.ResultSet. Os métodos getBlob de CallableStatement não estão implementados.
- Funcionalidades do CLOB O Derby suporta a interface java.sql.Clob, e os métodos relacionados ao CLOB em java.sql.PreparedStatement e java.sql.ResultSet. Os métodos getClob dos procedimentos de CallableStatement não estão implementados.

Para utilizar as funcionalidades java.sql.Blob e java.sql.Clob:

- Utilizar o tipo BLOB do SQL para armazenamento; Os tipos LONG VARCHAR FOR BIT DATA, BINARY e VARCHAR FOR BIT DATA também funcionam.
- Utilizar o tipo CLOB do SQL para armazenamento; Os tipos LONG VARCHAR, CHAR e VARCHAR também funcionam.
- Utilizar os métodos getBlob ou getClob da interface java.sql.ResultSet, para obter um tratador de BLOB ou CLOB para os dados subjacentes.
- Não podem ser chamados métodos estáticos (Extensão SQL sobre SQL) em qualquer coluna LOB.

Além disso, a conversão entre cadeias e BLOBs não é recomendada, porque a conversão é dependente da plataforma e do banco de dados.

O Derby utiliza cadeias UNICODE (caracteres com 2 bytes), enquanto outros produtos de banco de dados podem utilizar caracteres ASCII (1 byte por caractere). Se forem utilizadas várias páginas de código, cada caractere poderá necessitar de vários bytes. Poderá ser necessário um tipo BLOB maior para acomodar uma cadeia normal no Derby. Devem ser utilizados tipos CLOB para armazenar cadeias.

Restrições de BLOB, CLOB, (tipos-LOB):

- Os tipos-LOB não podem ser comparados com relação a igualdade (=) e desigualdade (!=, <>).
- Os valores dos tipos-LOB não são ordenáveis, portanto não são suportados os testes <, <=, >, >=.
- Os tipos-LOB não podem ser utilizados em índices, ou como colunas de chave primária.
- Também são proibidas as cláusulas DISTINCT, GROUP BY e ORDER BY nos tipos-LOB.
- Os tipos-LOB não podem estar envolvidos em conversões implícitas como outros tipos base.

O Derby implementa todos os métodos para estas interfaces do JDBC 2.0, exceto pelos métodos set e get da interface CallableStatement.

Recomendações: Como o tempo de vida de java.sql.Blob e java.sql.Clob termina quando a transação é efetivada, deve ser desativada a auto-efetivação (auto-commit) quando se usa as funcionalidades java.sql.Blob e java.sql.Clob.

Tabela 1. Métodos java.sql.Blob do JDBC 2.0 suportados
Retorna | Assinatura | Notas de implementação
--- | --- | ---
InputStream | getBinaryStream() |
byte[] | getBytes(long pos, int length) | São lançadas exceções se pos < 1, se pos for maior que o comprimento, ou se length <= 0.
long | length() |
long | position(byte[] pattern, long start) | São lançadas exceções se pattern == null, se start < 1, ou se pattern for uma matriz de comprimento 0.
long | position(Blob pattern, long start) | São lançadas exceções se pattern == null, se start < 1, se pattern possuir comprimento 0, ou se for lançada uma exceção ao tentar ler o primeiro byte de pattern.

Tabela 2. Métodos java.sql.Clob do JDBC 2.0 suportados
Retorna | Assinatura | Notas de implementação
--- | --- | ---
InputStream | getAsciiStream() |
Reader | getCharacterStream() | NÃO SUPORTADO
String | getSubString(long pos, int length) | São lançadas exceções se pos < 1, se pos for maior que o comprimento de Clob, ou se length <= 0.
long | length() |
long | position(Clob searchstr, long start) | São lançadas exceções se searchStr == null, se start < 1, se searchStr possuir comprimento 0, ou se for lançada uma exceção ao tentar ler o primeiro caractere de searchStr.
long | position(String searchstr, long start) | São lançadas exceções se searchStr == null, se start < 1, ou se o padrão for uma cadeia vazia.

- Notas

Tópico pai: Referência do JDBC
Conceitos relacionados
Classes, interfaces e métodos java.sql do núcleo do JDBC
Referências relacionadas
java.sql.Driver
java.sql.DriverManager.getConnection
java.sql.Driver.getPropertyInfo
java.sql.Connection
java.sql.DatabaseMetaData
java.sql.Statement
java.sql.PreparedStatement
java.sql.CallableStatement
java.sql.ResultSet
java.sql.ResultSetMetaData
java.sql.SQLException
java.sql.SQLWarning
Mapeamento de java.sql.Types em tipos SQL
java.sql.Connection
java.sql.ResultSet
java.sql.Statement
java.sql.PreparedStatement
java.sql.CallableStatement
java.sql.DatabaseMetaData
java.sql.ResultSetMetaData
java.sql.BatchUpdateException
Pacote JDBC para Connected Device Configuration/Foundation Profile (JSR169)
Funcionalidades apenas do JDBC 3.0
java.sql.Connection
java.sql.DatabaseMetaData
java.sql.ParameterMetaData
java.sql.PreparedStatement
java.sql.Savepoint
java.sql.Statement
Sintaxe de escape do JDBC