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

例外のGoogle 翻訳は次のとおりです。

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は次のようになります。DBが望むように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)を使用して文字列フォーマットのロケールを指定できます。

于 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'))"

各引数に多くの値を使用しないでください。各引数に 1 つだけ、合計 6 つの値を使用してください。

于 2012-11-13T14:34:35.400 に答える