为什么我不能在 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){}
}
我的目标是将 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){}
}