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). 生成无效符号异常。但是当我在 squirrel 中执行查询时,它会被提交得很好。有谁知道为什么会这样?


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
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 回答
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());

这样,您无需将日期转换为字符串即可由数据库将其转换回。此外,您可能会发现该声明更易于阅读,并且您永远不必担心用户使用 ' (单引号)命名他们的帐户:)

于 2010-12-14T14:50:54.910 回答