Instru????es preparadas e colunas de fluxo

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.

O Derby suporta os tr??s tipos de fluxo fornecidos pelo JDBC 1.2. Estes tr??s fluxos s??o:
  • setBinaryStream

    para fluxos contendo bytes n??o interpretados

  • setAsciiStream

    para fluxos contendo caracteres ASCII

  • setUnicodeStream

    para fluxos contendo caracteres Unicode

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 Tipos de dado JDBC que permitem fluxo. Os fluxos n??o podem ser armazenados em colunas de outros tipos de dado nativos, ou em tipos de dado definidos pelo usu??rio.
Tabela 1. 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 Mapeamento de java.sql.Types em tipos SQL.)
Nota: 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();