1

JDBC を使用してデータベースに書き込む必要があり (hibernate/ibatis はオプションではありません)、私のデータベースは Oracle 11g です。

次のクエリを作成します。insert into user(user_id, username, age, creation_ts) values(seq_userid.NEXTVAL, 'Jack', 19,TO_TIMESTAMP('14/12/2010 15/09/46', 'DD/MM/RR HH24/MI/SS'));

しかし、私のstatetement.execeuteUpdate(above sql)。無効な符号の例外を生成します。しかし、リスでクエリを実行すると、問題なくコミットされます。なぜこれが起こっているのか誰にも分かりますか?


Edit:
user table:
id: number : not null
username varchar2(30) not null
age number(10) not null
creation_ts timestamp not null

Error:
ORA-00911: invalid character

Java snippet:
try
        {       
            DriverManager.registerDriver (new oracle.jdbc.OracleDriver());
            String url = "privatized";
            Connection conn = DriverManager.getConnection(url, "username", "password");

            Statement st = conn.createStatement();

            Format formatter = new SimpleDateFormat(dateTimeFormatString);
            String formattedDate = formatter.format(Calendar.getInstance(TimeZone.getDefault()).getTime()); 

            StringBuilder insertQuery = new StringBuilder("insert into user(user_id, username, age, creation_ts) values(seq_userid.NEXTVAL,");
                insertQuery.append(username);
                insertQuery.append(",");
            insertQuery.append(age);
            insertQuery.append(",TO_TIMESTAMP('");
            insertQuery.append(formattedDate);
            insertQuery.append("', 'DD/MM/RR HH24/MI/SS'));");
            System.err.println(insertQuery.toString());
            st.executeUpdate(insertQuery.toString());

            conn.close();
        } catch (SQLException ex){
            System.err.println(ex.getMessage());
            System.err.println(ex.getCause().toString());
            ex.printStackTrace();
            System.out.println("=========================================");
        } catch(Exception ex) {
            System.err.println(ex.getMessage());
        }
4

3 に答える 3

2

上記のコメントで述べたように、この問題は、SQLステートメントの最後にある余分なセミコロンが原因である可能性があります。この記事を参照してください

また、 PreparedStatmentsを調べて、生活を楽にすることもできます。上記のコードの大まかな翻訳は次のとおりです。いくつかの部品を残しましたが、おそらくエラーがあります。

String query = "insert into user(user_id, username, age, creation_ts) values(?,?,?,?)";
PreparedStatement pstmt = conn.prepareStatement(query);
... //fill in all your parameters
pstmt.setTimestamp(4, new Timestamp(System.currentTimeMillis()) );
... //execute here
于 2010-12-14T15:00:32.567 に答える
0

username変数の値がであり、'Jack'そうでないことを確認しますJackか?(ORA-00911エラーは、一般的な日付形式エラーのようには見えません)。

また、 PreparedStatementについても学ぶ必要があります。それらはより効率的で、読みやすく、デバッグしやすく、SQLインジェクションの影響を受けません。

私のJavaは少し錆びていますが、これは次のようになりますPreparedStatement

String query = "insert into user(user_id, username, age, creation_ts) values "
              + "(seq_userid.NEXTVAL, ?, ?, ?)";

Statement st = conn.prepareStatement(query);

st.setString(1, username);
st.setInt(2, age);
st.setTimestamp(3, new java.sql.Timestamp(
                          Calendar.getInstance(
                             TimeZone.getDefault()).getTimeMillis()));

st.executeUpdate(insertQuery.toString());

このように、DBによって日付を変換して戻すために、日付を文字列に変換する必要はありません。また、ステートメントが読みやすく、ユーザーがアカウントに'(一重引用符)で名前を付けることを心配する必要がない場合もあります:)

于 2010-12-14T14:50:54.910 に答える
0
TO_TIMESTAMP('14/12/2010 15/09/46', 'DD/MM/RR HH24/MI/SS')

4 桁の年を送信しますが、フォーマット文字列は 2 桁の年 (世紀なし) を定義します

これを試してください:

insertQuery.append("', 'DD/MM/RRRR HH24/MI/SS'));");
于 2010-12-14T14:33:38.433 に答える