As requisições setXXXStream realizam um fluxo de dados entre o
aplicativo e o banco de dados.
O JDBC permite que o parâmetro IN seja definido como um fluxo de entrada do
Java para passagem de uma grande quantidade de dados em frações menores.
Quando a instrução é executada, o driver de JDBC faz chamadas repetidas
a este fluxo de entrada, lendo seu conteúdo e transmitindo este conteúdo como
dados do parâmetro.
setBinaryStream
O
suporta os três tipos de fluxo fornecidos pelo JDBC 1.2.
Estes três fluxos são:
- setBinaryStream
setBinaryStream
para fluxos contendo bytes não interpretados
- setAsciiStreamsetAsciiStream
para fluxos contendo caracteres ASCII
- setUnicodeStream
UnicodesetUnicodeStream
setUnicodeStream
para fluxos contendo caracteres Unicode
Stream
O JDBC requer que seja especificado o comprimento do fluxo.
O objeto de fluxo passado para estes três métodos pode ser tanto um
objeto de fluxo Java padrão, quanto uma subclasse própria do usuário que
implementa a interface java.io.InputStream padrão.
De acordo com o padrão JDBC, os fluxos somente podem ser armazenados em
colunas dos tipos de dado mostrados na tabela
.
Os fluxos não podem ser armazenados em colunas de outros tipos de dado nativos,
ou em tipos de dado definidos pelo usuário.
Tipos de dado JDBC que permitem fluxo
Valores da coluna
Tipo correspondente
AsciiStream
UnicodeStream
BinaryStream
CLOB
java.sql.Clob
x
x
CHAR
x
x
VARCHAR
x
x
LONGVARCHAR
X
X
BINARY
x
x
x
BLOB
java.sql.Blob
x
x
x
VARBINARY
x
x
x
LONGVARBINARY
x
x
X
O X maiúsculo indica o tipo de dado de destino preferido para o tipo de
fluxo (Consulte .)
Se o fluxo for armazenado em uma coluna de um tipo que não seja
LONG VARCHAR ou LONG VARCHAR FOR BIT DATA, deverá ser possível que todo o
fluxo caiba na memória de uma só vez.
Os fluxos armazenados em colunas LONG VARCHAR e LONG VARCHAR FOR BIT DATA
não possuem esta limitação.
O exemplo a seguir mostra como o usuário pode armazenar
java.io.File em uma coluna LONG VARCHAR usando fluxo:
Statement s = conn.createStatement();
s.executeUpdate("CREATE TABLE minha_tabela (a INT, b LONG VARCHAR)");
conn.commit();
java.io.File arquivo = new java.io.File("derby.txt");
int comprArquivo = (int) arquivo.length();
// primeiro, criar o fluxo de entrada
java.io.InputStream fluxoEntrada = new java.io.FileInputStream(arquivo);
PreparedStatement ps = conn.prepareStatement(
"INSERT INTO minha_tabela VALUES (?, ?)");
ps.setInt(1, 1);
// definir o valor do parâmetro de entrada como sendo o fluxo de entrada
ps.setAsciiStream(2, fluxoEntrada, comprArquivo);
ps.execute();
conn.commit();