尝试将double值插入Oracle数据库时出现SQLException

时间:2012-11-13 13:37:26

标签: java sql string oracle11g ora-00913

我必须开发一个将一些数据插入Oracle数据库的小程序。不幸的是我在SQL Statement和执行它时遇到了一些麻烦。这是我正在使用的代码:

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()));

这是执行应该工作的部分,但是我收到以下错误:

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

Google Translate例外是:

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

4 个答案:

答案 0 :(得分:5)

您可以使用Guallaume在评论中建议的这样的预备语句;

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){}
 }

答案 1 :(得分:3)

请勿使用此语法

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

使用此代替

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

表格可能会有所变化。字段可能会被添加/删除/重新排序 - 如果您的INSERT语句将再次中断。

当然,正如其他人建议的那样,你应该使用预准备语句来避免SQL注入和语法错误...想象一下,item.getTitle()是其中任何一个

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

答案 2 :(得分:1)

你真的应该使用PreparedStatements,相信我们......

但是,在这种情况下,问题很可能是您的语言环境使用小数点的逗号(,)字符。

所以1/4成为:0,25,而不是0.25正如数据库所希望的那样!

为什么这是一个问题?

看看这个:

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

两者都被视为具有 2 值,只有第一个对我们来说并不明显,他们使用逗号作为小数点...所以你必须将逗号更改为点,或将语言环境更改为美国。

正确:

INSERT INTO SOMETABLE VALUES ( 0.25);

您可以通过提供适当的区域设置,使用String.format(Locale l, String format, Object... args)指定字符串格式的区域设置。

答案 3 :(得分:0)

此格式字符串已更正。

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

不要为每个参数使用多个值,每个参数只使用一个,总共六个值。