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?
icefox
Julho 25, 2012, 1:24pm
#2
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?
icefox
Julho 25, 2012, 8:28pm
#4
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.
icefox
Julho 25, 2012, 8:33pm
#5
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.
icefox
Julho 26, 2012, 8:38am
#7
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
icefox
Julho 26, 2012, 9:29am
#9
É estava equivocado ! Você está correto.