我必须开发一个小程序,将一些数据插入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
您可以按照 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){}
}
不要使用此语法
INSERT INTO table VALUES (val1, val2, ...)
用这个代替
INSERT INTO table (col1, col2, ...) VALUES (val1, val2, ...)
表格可能会发生变化。字段可能会被添加/删除/重新排序 - 在这种情况下,您的
INSERT
语句将再次中断。
当然,正如其他人所建议的,您应该使用准备好的语句来避免 SQL 注入和语法错误...想象一下,
item.getTitle()
是其中任何一个
"a', 'b";
"a'); DROP TABLE tops;' ...";
你真的应该使用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) 通过提供适当的区域设置来指定字符串格式的区域设置。
此格式字符串已更正。
"INSERT INTO tops VALUES (%f, '%s', %f, %.2f, '%s', TO_TIMESTAMP('%s', 'YYYY-MM-DD HH24:MI:SS.FF'))"
不要为每个参数使用多个值,每个参数仅使用一个值,总共六个值。