Problemas com Oracle e Jdbc

16 respostas
FSRech

Olá a todos, eu estou fazendo alguns selects em uma base Oracle para gerar um arquivo para exportacao, acontece que determinados campos tem que possuir determinados numeros de caracteres, por exemplo o campo nome, no layout de exportacao ele deve conter obrigatoriamente 70 caracteres, o resto completado automaticamente com espacos em brancos. Para fazer isto no oracle é muito facíl, basta eu agir desta maneira:

SELECT LPAD(NOME_CLIENTE,70,' ') FROM CLIENTES

Isto no SqlWorksheet do Oracle me retorna a string que eu preciso com 70 caracteres.
Acontece que se eu colocar esta sql no jdbc, o mesmo interpreta como se o lpad fosse uma coluna, alguê a infrentou este problema ?

Obrigado

16 Respostas

Luca

Olá

Mostre o PreparedStatement que está usando.

[]s
Luca

FSRech

Luca:
Olá

Mostre o PreparedStatement que está usando.

[]s
Luca


Ola Luca obrigado pela resposta, abaixo segue o código:

O v_clientes é uma view.

[s]

danieldestro

Ou você pega o valor pelo indice ou pelo nome.

Se quiser mudar o nome da coluna:

SELECT LPAD(NOME_CLIENTE,70,' ') AS NOME FROM CLIENTES
FSRech

[quote=danieldestro]Ou você pega o valor pelo indice ou pelo nome.

Se quiser mudar o nome da coluna:

SELECT LPAD(NOME_CLIENTE,70,' ') AS NOME FROM CLIENTES

Olá Amigo obrigado pela resposta, é que eu preciso fazer um lpad das strings retornadas do banco, tipo o nome vem do banco com 35 caracteres, eu preciso preencher o restante com 35 espacos em branco.
O meu problema realmente é que este select nao funciona com o jdbc.

[s]

danieldestro

Certamente você está fazendo algo errado.
Qual o erro?

FSRech

danieldestro:
Certamente você está fazendo algo errado.
Qual o erro?

é provavel que eu esteja fazendo algo errado mesmo, mas o estranho que no sql do oracle funciona, olha abaixo o erro:

java.sql.SQLException: Nome de coluna inválido
        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:169)
        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:211)
        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:274)
        at oracle.jdbc.driver.OracleStatement.get_column_index(OracleStatement.java:4541)
        at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java:666)
        at oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java:1374)
J

Fiz um exemplo aqui e rodou sem problemas:

public void listar() throws Exception {
   Connection conn = null;
    try {
Class.forName("oracle.jdbc.driver.OracleDriver");	
conn = DriverManager.getConnection("jdbc:oracle:thin:@<host>:<porta>:<nome_do_banco>", "<conta>", "<senha>");
PreparedStatement ps = conn.prepareStatement("select lpad(campo,70,'@') as t from <tabela> where rownum < 10");
ResultSet rset = ps.executeQuery();
  while (rset.next()) {
   System.out.println(rset.getString(1));
   }
   rset.getStatement().close();
   rset.close();	        
}
 catch(Exception e) {
   throw e;
 }
   finally {
        if(conn != null)
            conn.close();
    }
}

Mesmo executando essa consulta numa view também funcionou.

FSRech

julianostr:
Fiz um exemplo aqui e rodou sem problemas:

public void listar() throws Exception {
   Connection conn = null;
    try {
Class.forName("oracle.jdbc.driver.OracleDriver");	
conn = DriverManager.getConnection("jdbc:oracle:thin:@<host>:<porta>:<nome_do_banco>", "<conta>", "<senha>");
PreparedStatement ps = conn.prepareStatement("select lpad(campo,70,'@') as t from <tabela> where rownum < 10");
ResultSet rset = ps.executeQuery();
  while (rset.next()) {
   System.out.println(rset.getString(1));
   }
   rset.getStatement().close();
   rset.close();	        
}
 catch(Exception e) {
   throw e;
 }
   finally {
        if(conn != null)
            conn.close();
    }
}

Mesmo executando essa consulta numa view também funcionou.


o meu está do mesmo jeito e não funciona, coisa de louco!

FSRech

olha so como está:

dreamspeaker

Cara. como está o seu getString(…)?

danieldestro

Faça assim:

String valor = rs.getString(1);

ou

String valor = rs.getString(“t”);

Creio que esteja errando ai.

J

Era isso mesmo que eu iria perguntar agora.

Como está o rs.getString() ??

Demorei pra colocar a pergunta…dá nisso…

FSRech

Bom dia a todos! Realmente eu errei isto mesmo, mas aproveitando, quando eu coloco o getString(1) ele me retorna corretamente, mas digamos e eu precisar fazer um select de varios campos, ex:

SELECT LPAD(NOME_CLIENTE,70,'  '), LPAD(CPF_CLIENTE,11,'') FROM CLIENTES

quanto eu faco o getString(1) desta query, ele me retorna logicamente a primeira coluna, o nome.
Tem como eu fazer um getString() de todo o resultado?

GraveDigger

FSRech:
Bom dia a todos! Realmente eu errei isto mesmo, mas aproveitando, quando eu coloco o getString(1) ele me retorna corretamente, mas digamos e eu precisar fazer um select de varios campos, ex:

SELECT LPAD(NOME_CLIENTE,70,'  '), LPAD(CPF_CLIENTE,11,'') FROM CLIENTES

quanto eu faco o getString(1) desta query, ele me retorna logicamente a primeira coluna, o nome.
Tem como eu fazer um getString() de todo o resultado?

getString(1) e depois getString(2).

Uma forma q eu uso mto eh como segue:

int count = 0;

while(rs.next()) {

nome = rs.getString(++count);
cpf = rs.getString(++count);

count = 0;


}
FSRech

GraveDigger:
FSRech:
Bom dia a todos! Realmente eu errei isto mesmo, mas aproveitando, quando eu coloco o getString(1) ele me retorna corretamente, mas digamos e eu precisar fazer um select de varios campos, ex:

SELECT LPAD(NOME_CLIENTE,70,'  '), LPAD(CPF_CLIENTE,11,'') FROM CLIENTES

quanto eu faco o getString(1) desta query, ele me retorna logicamente a primeira coluna, o nome.
Tem como eu fazer um getString() de todo o resultado?

getString(1) e depois getString(2).

Uma forma q eu uso mto eh como segue:

int count = 0;

while(rs.next()) {

nome = rs.getString(++count);
cpf = rs.getString(++count);

count = 0;


}


Beleza Obrigado, acabei fazendo assim também

[s]

danieldestro

Se você quiser saber, dinamicamente, quanto ‘campos’ vieram, pode usar o metadado do resultset.

Criado 26 de outubro de 2006
Ultima resposta 27 de out. de 2006
Respostas 16
Participantes 6