java.sql.SQLException:ORA-00913:尝试将双精度值插入 Oracle 数据库时,值太多

问题描述 投票:0回答:4

我必须开发一个小程序,将一些数据插入Oracle数据库。

不幸的是,我在 SQL 语句及其执行方面遇到了一些问题。这是我正在使用的代码:

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: Too many values
java sql string oracle11g ora-00913
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){}
 }

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;' ...";

1
投票

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

但是,在这种情况下,问题很可能是您的语言环境使用逗号 (

,
) 字符作为小数点..

因此 1/4 变为:

0,25
,而不是数据库希望的
0.25

为什么这是一个问题?

看这个:

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

两者都被视为具有 2 值,只是第一个对于我们使用逗号作为小数点的人来说并不明显......所以你必须将逗号更改为点,或者将区域设置更改为 US。

正确:

INSERT INTO SOMETABLE VALUES ( 0.25);

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


0
投票

此格式字符串已更正。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.