# 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();

Tópico pai: java.sql.PreparedStatement