2012-11-13 43 views
8

我必须开发一个将一些数据插入Oracle数据库的小程序。不幸的是,我在执行SQL Statement时遇到了一些问题。这是我使用的代码:尝试向Oracle数据库中插入双值时出现SQLException

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 
+0

我认为你可以将引号从字符串值中排除。 –

+3

听起来像您要插入的值与表架构不匹配。 (值太多) – MicSim

+11

使用准备好的语句,字符串操作是一个非常糟糕的主意 – Guillaume

回答

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

我希望格式更好一点。正如你所看到的,你需要知道你打算在准备好的语句查询中插入值的列名。例如'INSERT INTO tops(id,title,elements,size,entity,timeStamp)VALUES(?,?,?,?,?,?)“这里我假定的列是id,title,elemets,size,entity和timestamp。'VALUES(?,?,?,?,?,?)'告诉java这些值将会在那里进行。'pstmt.setInt(1,item.getID());'设置第一个值, 'pstmt.setString(2,item.getTitle());'设置第二个值,'pstmt.setString(3,this.elements);'设置第三个值等等...... – mwangi

+0

谢谢你的回答。这工作graet! –

+0

欢迎帕特里克:) – mwangi

3

不要使用这种语法

​​

用这一个,而不是

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

表可能会改变。字段可能会被添加/删除/重新排序 - 以防您的语句再次破坏。

当然,正如其他建议,你应该使用准备好的语句,以避免SQL注入和语法错误......试想一下,item.getTitle()是任何这些

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

你真的应该使用预处理语句,相信我们......

在这种情况下,然而,问题是很可能,你的区域设置使用的小数点的逗号(,)字符..

所以1/4变成:0,25,而不是0.25,因为DB想要!

为什么这是一个问题?

看看这个:

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

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

正确:

INSERT INTO SOMETABLE VALUES (0.25); 

您可以指定字符串通过提供合适的语言环境中使用String.format(Locale l, String format, Object... args)格式化的语言环境。

+0

+1:好想法!这可能是... –

+0

@LukasEder我不是一个天才 - 我只是有很多奇怪的问题来处理:)在匈牙利,我们也使用逗号作为小数点......(尽管在我第一次发现这种情况会引起麻烦的时候,我甚至在我最尊敬的同事面前大声说出了一些非政治正确的表达方式......) – ppeterka

+0

是的e类型的错误创建“wtf-situations”... –

0

此格式字符串已更正。

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

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

相关问题