JDBC: жалуется на недопустимый знак, но выглядит нормально - PullRequest
1 голос
/ 14 декабря 2010

Мне нужно использовать 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());
        }

Ответы [ 3 ]

2 голосов
/ 14 декабря 2010

Как я добавил в комментарии выше, проблема может быть связана с лишней точкой с запятой в конце вашего оператора 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
0 голосов
/ 14 декабря 2010

Вы уверены, что значение переменной 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());

Таким образом, вам не нужно преобразовывать дату в строку, чтобы преобразовать ее обратно в БД.Кроме того, вам может быть легче прочитать это заявление, и вам никогда не придется беспокоиться о том, что пользователь называет свою учетную запись с помощью '(одинарная кавычка) :)

0 голосов
/ 14 декабря 2010
TO_TIMESTAMP('14/12/2010 15/09/46', 'DD/MM/RR HH24/MI/SS')

Вы отправляете год из 4 цифр, но строка формата определяет год из двух цифр (без столетия)

Дайте попробовать:

insertQuery.append("', 'DD/MM/RRRR HH24/MI/SS'));");
...