我的目標是將一系列歌曲從 SQLite DB 中的歌曲表傳輸到 oracle DB 中的歌曲表。首先我從 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
uj5u.com熱心網友回復:
永遠不要使用字串連接構建 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){}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/446893.html
