8

我必须开发一个将一些数据插入 Oracle 数据库的小程序。不幸的是,我在 SQLStatement及其执行方面遇到了一些麻烦。这是我正在使用的代码:

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

谷歌翻译例外是:

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

4 回答 4

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){}
 }
于 2012-11-13T13:55:47.067 回答
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;' ...";
于 2012-11-13T13:44:38.580 回答
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)通过提供适当的语言环境来指定字符串格式的语言环境。

于 2012-11-13T14:11:14.300 回答
0

此格式字符串已更正。

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

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

于 2012-11-13T14:34:35.400 回答