Ajuda com prepareStatement();

9 respostas
S

Galera, tenho o seguinte prepareStatement:

ps = conn.prepareStatement("insert into dat_tr_stroke (dat_versao_ualf,dat_data,dat_nanosegundo,dat_latitude,dat_longitude,dat_corrente_pico_ka,dat_multiplicidade,dat_numero_sensores,dat_graus_liberdade,dat_azimute_elipse,dat_semieixo_maior,dat_semieixo_menor,dat_chiquadrado,dat_tempo_subida,dat_largura_pulso,dat_maxima_derivada,dat_flag_intranuvem,dat_flag_angulo,dat_flag_sinal,dat_flag_tempo) values(?,to_timestamp('?/?/? ?:?:?.?','DDMMYYYYHH24MISSUS'),?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);");

estou setando o prepareStatment desta forma:

ps.setInt(1, Integer.parseInt(vetor[0]));
            for(int i=2; i<=8; i++)
                ps.setString(i, vetor[i-1]);
            ps.setInt(9, Integer.parseInt(vetor[7]));
            ps.setDouble(10, Double.parseDouble(vetor[8]));
            ps.setDouble(11, Double.parseDouble(vetor[9]));
            ps.setDouble(12, Double.parseDouble(vetor[10]));
            ps.setInt(13, Integer.parseInt(vetor[11]));
            ps.setInt(14, Integer.parseInt(vetor[12]));
            ps.setInt(15, Integer.parseInt(vetor[13]));
            for(int i=16; i<=23; i++)
                ps.setDouble(i, Double.parseDouble(vetor[i-2]));
            for(int i=24; i<=27; i++)
                ps.setInt(i,Integer.parseInt(vetor[i-2]));
            ps.addBatch();

E ta dando este erro:

org.postgresql.util.PSQLException: Nenhum valor especificado para parâmetro 2.
        at org.postgresql.core.v3.SimpleParameterList.checkAllParametersSet(SimpleParameterList.java:146)
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:315)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2674)
        at janelaPrincipal.getTabela(janelaPrincipal.java:76)
        at janelaPrincipal.<init>(janelaPrincipal.java:23)
        at janelaPrincipal$1.run(janelaPrincipal.java:55)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

Alguém pode me dar uma ajuda de onde está o erro?
Imagino que seja alguma coisa bem boba que nao estou enchergando, porém nao estou conseguindo ver.
Alguém pode me dar uma ajuda? Obrigado.

9 Respostas

dreamspeaker

Eu não sei porque do erro, talvez alguma coisa no vetor esteja nulo, mas se o seu campo na tabela é do tipo timestamp, porque vc não usa ps.setTimestamp(…) ao invés de criar um parâmetro para dia, outro pra mês, outro pra ano, outro pra…

S

Eu to tentando fazer isso, porém nao sei como fazer. Pois o ps.setTimestamp() precisa de um formato dos EUA, e eu to tentando inserir um formato BR.

StringBuilder temp = new StringBuilder();
            temp.append(vetor[1]);
            temp.append("/");
            temp.append(vetor[2]);
            temp.append("/");
            temp.append(vetor[3]);
            temp.append(" ");
            temp.append(vetor[4]);
            temp.append(":");
            temp.append(vetor[5]);
            temp.append(":");
            temp.append(vetor[6]);
            temp.append(".");
            temp.append(vetor[7]);

ai to querendo colocar esse stringbuilder como um timestamp, porém estou totalmente perdido =/

dreamspeaker

Não entendi o precisa de um formato dos EUA.

Enfim, tenta isso:

//ano, mes(de 0 a 11), dia, hora, minutos, segundos long mls = new GregorianCalendar(2008, 4-1, 15, 18, 25, 00).getTimeInMillis(); Timestamp tmsp = new Timestamp(mls); ps.setTimestamp(2,tmsp);

S

Para falar a verdade eu preciso passar Nanosegundos. Trabalho com raios e isso é o mais necessário.
Fiz desta forma:

StringBuilder temp = new StringBuilder();
            temp.append("to_timestamp('");
            temp.append(vetor[3]);
            //temp.append("/");
            temp.append(vetor[2]);
            //temp.append("/");
            temp.append(vetor[1]);
            //temp.append(" ");
            temp.append(vetor[4]);
            //temp.append(":");
            temp.append(vetor[5]);
            //temp.append(":");
            temp.append(vetor[6]);
            //temp.append(".");
            temp.append(vetor[7]);
           
            /*Timestamp t = new Timestamp(Integer.parseInt(vetor[1]),
                    Integer.parseInt(vetor[2]),
                    Integer.parseInt(vetor[3]),
                    Integer.parseInt(vetor[4]),
                    Integer.parseInt(vetor[5]),
                    Integer.parseInt(vetor[6]),
                    Integer.parseInt(vetor[7])); */
            temp.append("','DDMMYYYYHH24MISSUS')");
ps.setString(2, temp.toString());

Porém ele está dando este erro:

java.sql.BatchUpdateException: Entrada em lote 0 insert into dat_tr_stroke (dat_versao_ualf,dat_data,dat_nanosegundo,dat_latitude,dat_longitude,dat_corrente_pico_ka,dat_multiplicidade,dat_numero_sensores,dat_graus_liberdade,dat_azimute_elipse,dat_semieixo_maior,dat_semieixo_menor,dat_chiquadrado,dat_tempo_subida,dat_largura_pulso,dat_maxima_derivada,dat_flag_intranuvem,dat_flag_angulo,dat_flag_sinal,dat_flag_tempo) values(0,to_timestamp( '1122007009751741400','DDMMYYYYHH24MISSUS'),751741400,-14.0534,-43.5762,-50,0,5,2.0,8.7,38.4,1.9,3.7,6.0,51.2,-0.0,0,0,0,1) foi abortada. Chame getNextException para ver a causa.
        at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2537)
        at org.postgresql.core.v3.QueryExecutorImpl$ErrorTrackingResultHandler.handleError(QueryExecutorImpl.java:283)
        at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1328)
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:332)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2674)
        at janelaPrincipal.getTabela(janelaPrincipal.java:79)
        at janelaPrincipal.<init>(janelaPrincipal.java:24)
        at janelaPrincipal$1.run(janelaPrincipal.java:58)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
CONSTRUÍDO COM SUCESSO (tempo total: 2 segundos)

Tentei usar o Date, porem ele nao me deixa inserir nanosegundos. Ai tentei passar de uma vez soh em comando sql, mas nao estou conseguindo.

S

Não entendi o precisa de um formato dos EUA.

Enfim, tenta isso:

//ano, mes(de 0 a 11), dia, hora, minutos, segundos long mls = new GregorianCalendar(2008, 4-1, 15, 18, 25, 00).getTimeInMillis(); Timestamp tmsp = new Timestamp(mls); ps.setTimestamp(2,tmsp);

Eu preciso passar algo neste formato: DD/MM/YYYY HH24:MI:SS.US
Onde US eh o nanosegundo.

dreamspeaker

Não tenho o PostgreSQL aqui, mas ainda não entendi porque vc não pode usar a classe Timestamp

javadoc do Timestamp:
setNanos

public void setNanos(int n)

Sets this Timestamp object's nanos field to the given value...</blockquote>
S

e como depois eu formato os dados que eu inserir para voltarem da forma que eu quiser?]

tipo: DD/MM/YYYY HH24:MI:SS.US ?

dreamspeaker

Aí vc usa a função to_char no select

http://www.postgresql.org/docs/8.1/static/functions-formatting.html

S

Eu nao posso por esse to_char no insert? Pois eles querem um dado já formatado inserido no banco, o Timestamp passa yyyy-mm-dd e eu preciso de dd/mm/yyyy.

Criado 15 de abril de 2008
Ultima resposta 16 de abr. de 2008
Respostas 9
Participantes 2