为什么我不能在 jdbc 中插入 oracle?

why I can not insert into oracle in jdbc?

我的目标是将 SQLite DB 中的歌曲 table 中的一系列歌曲传输到 oracle DB 中的歌曲 table 中。首先我select从SQLite中获取信息,然后将其传输到oracle的歌曲中,但它给出了以下错误。

    try {
        ResultSet resultSet = sqliteConnectionStatement.executeQuery("select * from songs");
        while (resultSet.next()) {
            oracleConnectionStatement.execute("insert into songs values (" + resultSet.getInt("_id") +
                    "," + resultSet.getInt("track") +
                    ",'" + resultSet.getString("title") +
                    "'," + resultSet.getInt("album") + ")");
        }
        System.out.println("data transferred with no error");
        resultSet.close();
    } catch (SQLException e) {
        System.out.println("Oops!something went wrong! : " + e.getMessage());
        e.printStackTrace();
    }

输出:

Oops! something went wrong! : ORA-00917: missing comma

java.sql.SQLSyntaxErrorException: ORA-00917: missing comma

    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:630)
    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:564)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1231)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:772)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:299)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:512)
    at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:123)
    at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:1200)
    at oracle.jdbc.driver.OracleStatement.executeSQLStatement(OracleStatement.java:1820)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1472)
    at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:2505)
    at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:2460)
    at oracle.jdbc.driver.OracleStatementWrapper.execute(OracleStatementWrapper.java:328)
    at org.ISOFT.Main.main(Main.java:21)
Caused by: Error : 917, Position : 37, Sql = insert into songs values (1,2,'I Can't Quit You Baby',343), OriginalSql = insert into songs values (1,2,'I Can't Quit You Baby',343), Error Msg = ORA-00917: missing comma

    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:637)
    ... 13 more

从不 使用字符串连接构建 SQL 语句。您的代码将容易受到 SQL 注入攻击,如果您 运行 使用不同参数的相同查询,那么 SQL 引擎每次都需要解析它,从而使一切变慢。

使用准备好的语句并绑定变量。代码不会受到 SQL 注入攻击,SQL 引擎只需要解析一次就可以重用之前的执行计划。

类似于(未测试):

ResultSet resultSet;
try {
  resultSet = sqliteConnectionStatement.executeQuery(
    "select * from songs"
  );
  oracleConnectionStatement.setAutoCommit(false);
  PreparedStatement stmt = oracleConnectionStatement.prepareStatement(
    "INSERT INTO songs (id, track, title, album) VALUES (?, ?, ?, ?)"
  );
  while (resultSet.next()) {
    stmt.setInt(1, resultSet.getInt("_id"));
    stmt.setInt(2, resultSet.getInt("track"));
    stmt.setString(3, resultSet.getString("title"));
    stmt.setInt(4, resultSet.getInt("album"));
    stmt.addBatch();
  }
  stmt.executeBatch();
  oracleConnectionStatement.commit();
  System.out.println("data transferred with no error");
} catch (SQLException e) {
   System.out.println("Oops!something went wrong! : " + e.getMessage());
   e.printStackTrace();
} finally {
  // Close the result set
  if (resultSet != null)
  {
    try {
      resultSet.close();
    } catch (Exception e){}
  }
  // Close the connections
  try {
    sqliteConnectionStatement.close();
  } catch (Exception e){}
  try {
    oracleConnectionStatement.close();
  } catch (Exception e){}
}