8 votes

SQLException en essayant d'insérer une valeur double dans la base de données Oracle

Je dois développer un petit programme qui insère certaines données dans une base de données Oracle. Malheureusement, j'ai quelques problèmes avec un SQL Statement et l'exécution de celle-ci. Voici le code que j'utilise :

db.execute(
    String.format("INSERT INTO tops VALUES (%d, '%s', %d, %f.00, '%s', TO_TIMESTAMP('%s', 'YYYY-MM-DD HH24:MI:SS.FF'))", 
        item.getID(),
        item.getTitle(),
        this.elements,
        item.getSize(),
        item.getEntity(),
        timestamp.toString()));

C'est la partie où l'exécution devrait fonctionner mais je reçois l'erreur suivante :

java.sql.SQLException: ORA-00913: Zu viele Werte

Google Translate pour l'exception est :

java.sql.SQLException: ORA-00913: Too many values

5voto

mwangi Points 768

Vous pouvez utiliser des déclarations préparées comme celle-ci, comme le suggère Guallaume dans son commentaire ;

PreparedStatement pstmt = null;
Connection conn = null;

try{
     //if you have a method that creates a connection for you.
     conn = getConnection();
     pstmt = conn.prepareStatement("INSERT INTO tops(id, title, elements, size, entity, timeStamp) VALUES(?,?,?,?,?,?)");
     pstmt.setInt(1,item.getID());

     //Assuming that title is a String data type
     pstmt.setString(2,item.getTitle());
     pstmt.setString(3,this.elements);
     pstmt.setDouble(4,item.getSize()); // <--- JDBC will make sure this works

     //assuming Entity data type is String
     pstmt.setString(5,item.getEntity());

     //if your timestamp's string format is 
     //well formed, you may insert as a string.
     pstmt.setString(6,timestamp.toString());
     pstmt.executeUpdate();
}catch(Exception e){
     e.printStackTrace();
}finally{  
     try{
         pstmt.close();
     }catch(Exception e){}

     try{
         conn.close();
     }catch(Exception e){}
 }

3voto

Lukas Eder Points 48046

N'utilisez pas cette syntaxe

INSERT INTO table VALUES (val1, val2, ...)

Utilisez plutôt celui-ci

INSERT INTO table (col1, col2, ...) VALUES (val1, val2, ...)

Les tableaux peuvent changer. Des champs peuvent être ajoutés, supprimés ou réorganisés. INSERT La déclaration se briserait à nouveau.

Bien sûr, comme d'autres le suggèrent, vous devriez utiliser des instructions préparées pour éviter les injections SQL et les erreurs de syntaxe... Imaginez, item.getTitle() était l'un de ces

"a', 'b";
"a'); DROP TABLE tops;' ...";

1voto

ppeterka Points 12141

Vous devriez vraiment utiliser PreparedStatements, croyez-nous...

Dans ce cas, cependant, le problème est très probablement que votre locale utilise la virgule ( , ) pour le point décimal

Donc 1/4 devient : 0,25 pas 0.25 comme le souhaite la DB !

Pourquoi est-ce un problème ?

Regardez ça :

INSERT INTO SOMETABLE VALUES ( 0,25 );
INSERT INTO SOMETABLE VALUES ( 0, 25);

Les deux sont traités comme ayant 2 valeurs, seule la première n'est pas évidente pour nous, qui utilisons la virgule comme point décimal... Il faut donc changer la virgule en point, ou changer la locale en US.

Correct :

INSERT INTO SOMETABLE VALUES ( 0.25);

Vous pouvez spécifier la locale de la mise en forme de la chaîne en utilisant String.format(Locale l, String format, Object... args) en fournissant une locale appropriée.

0voto

Roman C Points 18658

Cette chaîne de format a été corrigée.

"INSERT INTO tops VALUES (%f, '%s', %f, %.2f, '%s', TO_TIMESTAMP('%s', 'YYYY-MM-DD HH24:MI:SS.FF'))"

N'utilisez pas plusieurs valeurs pour chaque argument, utilisez-en exactement une pour chaque argument, soit six valeurs au total.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X