Como recuperar os dados do campo long do Oracle?

Galera criei uma tabela exemplo no oracle 8i com o campo “texto” do tipo long.

Consigo incluir o texto, mas estou tendo dificuldades de extrair(recuperar) os dados do campo texto, alguém sabe uma maneira de realizar a query e manipular o conteúdo do tipo long para String com ejb?

Você não deve retornar ele como um array de bytes ?

Olha o exemplo abaixo:

public class LongTest {
    public static void pr(Object o){
        System.out.println(o);
    }
    
    public static String getString(long size){
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<size;i++)
            sb.append("*");
        return sb.toString();
    }
    
    public static void main(String[] args) throws SQLException, IOException {
        InputStream stream = null;
        DriverManager.registerDriver(new OracleDriver());
        Connection c = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1522:TEST","xxcm","xxcm");
        PreparedStatement ps = c.prepareStatement("insert into xxcm.xxcm_test_long_table(num_col,char_col,long_col) values(?,?,?)");
        ps.setInt(1,1);
        ps.setString(2,"setString");
        ps.setString(3,getString(4000));
        pr(ps.executeUpdate());
        
        ps.setInt(1,2);
        ps.setString(2,"setString");
        ps.setString(3,getString(32000));
        pr(ps.executeUpdate());
        
        ps.setInt(1,3);
        ps.setString(2,"setAsciiStream");
        stream = new ByteArrayInputStream(getString(32768).getBytes());
        ps.setAsciiStream(3,stream,stream.available());
        //ps.setString(3,getString(32767));//wont work for bigger than 32767
        pr(ps.executeUpdate());
        
        ps.setInt(1,4);
        ps.setString(2,"setAsciiStream");
        stream = new ByteArrayInputStream(getString(2><<16).getBytes());
        ps.setAsciiStream(3,stream,stream.available());
        pr(ps.executeUpdate());
        
        ps.close();
        c.close();
    }
}

Não sei se entendi, vc seta os valores no banco. Isso eu consigo fazer, o que eu nao consigo é buscar no banco e utilizá-lo na aplicação, entende?

Desculpe exemplo errado vou ver se localizo aqui um outro exemplo, mas creio que se você usar getAsciiStream(“campo”) vai lhe retornar um array de bytes.

Olha este exemplo !

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class Main {

  public static void main(String[] args) throws Exception {
    try {
      String url = "jdbc:odbc:yourdatabasename";
      String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
      String user = "guest";
      String password = "guest";

      FileInputStream fis = new FileInputStream("sometextfile.txt");

      Class.forName(driver);
      Connection connection = DriverManager.getConnection(url, user, password);
      Statement createTable = connection.createStatement();
      createTable.executeUpdate("CREATE TABLE source_code (name char(20), source LONGTEXT)");
      String ins = "INSERT INTO source_code VALUES(?,?)";
      PreparedStatement statement = connection.prepareStatement(ins);

      statement.setString(1, "TryInputStream2");
      statement.setAsciiStream(2, fis, fis.available());

      int rowsUpdated = statement.executeUpdate();
      System.out.println("Rows affected: " + rowsUpdated);
      Statement getCode = connection.createStatement();
      ResultSet theCode = getCode.executeQuery("SELECT name,source FROM source_code");
      BufferedReader reader = null;
      String input = null;

      while (theCode.next()) {
        reader = new BufferedReader(new InputStreamReader(theCode.getAsciiStream(2)));
        while ((input = reader.readLine()) != null) {
          System.out.println(input);
        }
      }
      connection.close();
    } catch (Exception e) {
      System.err.println(e);
    }
  }
}

a meu ponto de vista… não faz sentido salvar um texto em um campo Long…

não seria “VARCHAR2” no oracle?

e na sua classe você poderia simplismente espelhar o atributo texto como String.

Se não me engano o VARCHAR2 tem um limite de 255 caracteres, deste modo você não poderia salvar textos longos nele.

Se não me engano o VARCHAR2 tem um limite de 255 caracteres, deste modo você não poderia salvar textos longos nele.

[/quote]

cara dei uma rápida pesquisada…

o varchar2 no banco de dados pode armazenar mais de 4000 caracteres…

http://www.idevelopment.info/data/Oracle/DBA_tips/Database_Administration/DBA_25.shtml

É estava equivocado ! Você está correto.