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:
publicclassLongTest{publicstaticvoidpr(Objecto){System.out.println(o);}publicstaticStringgetString(longsize){StringBuildersb=newStringBuilder();for(inti=0;i<size;i++)sb.append("*");returnsb.toString();}publicstaticvoidmain(String[]args)throwsSQLException,IOException{InputStreamstream=null;DriverManager.registerDriver(newOracleDriver());Connectionc=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1522:TEST","xxcm","xxcm");PreparedStatementps=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=newByteArrayInputStream(getString(32768).getBytes());ps.setAsciiStream(3,stream,stream.available());//ps.setString(3,getString(32767));//wont work for bigger than 32767pr(ps.executeUpdate());ps.setInt(1,4);ps.setString(2,"setAsciiStream");stream=newByteArrayInputStream(getString(2><<16).getBytes());ps.setAsciiStream(3,stream,stream.available());pr(ps.executeUpdate());ps.close();c.close();}}
C
cmp.aroucha
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?
I
icefox
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.
I
icefox
Olha este exemplo !
importjava.io.BufferedReader;importjava.io.FileInputStream;importjava.io.InputStreamReader;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.Statement;publicclassMain{publicstaticvoidmain(String[]args)throwsException{try{Stringurl="jdbc:odbc:yourdatabasename";Stringdriver="sun.jdbc.odbc.JdbcOdbcDriver";Stringuser="guest";Stringpassword="guest";FileInputStreamfis=newFileInputStream("sometextfile.txt");Class.forName(driver);Connectionconnection=DriverManager.getConnection(url,user,password);StatementcreateTable=connection.createStatement();createTable.executeUpdate("CREATE TABLE source_code (name char(20), source LONGTEXT)");Stringins="INSERT INTO source_code VALUES(?,?)";PreparedStatementstatement=connection.prepareStatement(ins);statement.setString(1,"TryInputStream2");statement.setAsciiStream(2,fis,fis.available());introwsUpdated=statement.executeUpdate();System.out.println("Rows affected: "+rowsUpdated);StatementgetCode=connection.createStatement();ResultSettheCode=getCode.executeQuery("SELECT name,source FROM source_code");BufferedReaderreader=null;Stringinput=null;while(theCode.next()){reader=newBufferedReader(newInputStreamReader(theCode.getAsciiStream(2)));while((input=reader.readLine())!=null){System.out.println(input);}}connection.close();}catch(Exceptione){System.err.println(e);}}}
F
FelipeThi
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.
I
icefox
Se não me engano o VARCHAR2 tem um limite de 255 caracteres, deste modo você não poderia salvar textos longos nele.
F
FelipeThi
Se não me engano o VARCHAR2 tem um limite de 255 caracteres, deste modo você não poderia salvar textos longos nele.
cara dei uma rápida pesquisada…
o varchar2 no banco de dados pode armazenar mais de 4000 caracteres…