[英]Oracle JDBC transaction management and committing sessions
可以說我有以下代碼
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TestClass {
public static void main(String args[]) throws ClassNotFoundException, SQLException{
Connection database;
Class.forName("oracle.jdbc.driver.OracleDriver");
database =
DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:mydb", "user", "pass");
if (database.getAutoCommit())
database.setAutoCommit(false);
String insertParent = "Insert into ParentTable (parentId,name,value) values(parentSeq.nextval,?,?)";
String insertChild = "Insert into ChildTable (childId,parentId,value) values(childSeq.nextval,?,?)";
PreparedStatement addParentStmt = null;
PreparedStatement addChildStmt = null;
//Add the parent record
addParentStmt = database.prepareStatement(insertParent);
addParentStmt.setString(1,"Fruit");
addParentStmt.setString(2,"Orange");
addParentStmt.executeUpdate();
//Now retrieve the id of the parent row to insert into the child row
Statement stmt = null;
ResultSet rs = null;
stmt = database.createStatement();
rs = stmt.executeQuery("Select parentId from parentTable where value='Orange'");
//Now insert into the child table
addChildStmt = database.prepareStatement(insertChild );
if(rs.next()){
addChildStmt.setInt(1,rs.getInt("parentId"));
}
addChildStmt.setString(2,"The Orange child");
addChildStmt.executeUpdate(insertChild);
addChildStmt.close();
addParentStmt.close();
database.commit();
}
}
現在,每次我運行上面的代碼時,都會出現以下錯誤。
java.sql.SQLException: ORA-01008: not all variables bound
當我調試它時,例外是在行addChildStmt.executeUpdate(insertChild);處。
我不想在插入父記錄后發出提交。 我的理解是,如果我在同一會話中,則不必承諾。 上面顯示的第二個插入語句是否將與第一個插入語句不在同一會話中? 為什么即使我剛剛插入記錄,rs.next()仍不返回任何值?
謝謝
要編譯上面的代碼,oracle中將需要下表
create table ParentTable(parentId number, name varchar(20), value varchar(20));
create table childTable(childI number, parentid number, value varchar(20));
在Oracle中,還需要兩個序列parentSeq和childSeq。
謝謝
由於這不是真正的代碼,因此很難確定錯誤在哪里。 但是該策略本身是錯誤的:如果Orange不是唯一標識符,那么它將無法正常工作。 你應該
編輯:
現在代碼可以了,我已經找到了錯誤。 更換
addChildStmt.executeUpdate(insertChild);
與
addChildStmt.executeUpdate();
(並固定childId列的名稱)。 調試器或簡單日志將顯示select查詢確實返回了父ID。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.