Instruções preparadas e colunas de fluxo Requisições setXXXStream Colunas de fluxocomo parâmetros IN em instruções preparadas

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