我必须开发一个将一些数据插入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
答案 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'))"
不要为每个参数使用多个值,每个参数只使用一个,总共六个值。