簡體   English   中英

Oracle JDBC事務管理和提交會話

[英]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不是唯一標識符,那么它將無法正常工作。 你應該

  1. 執行選擇語句以從父序列中獲取下一個值並獲取父ID
  2. 執行插入語句以使用此父ID插入父
  3. 執行選擇語句以從子序列中獲取下一個值並獲取子ID
  4. 執行插入語句以插入具有父級ID和子級ID的子級。

編輯:

現在代碼可以了,我已經找到了錯誤。 更換

addChildStmt.executeUpdate(insertChild);

addChildStmt.executeUpdate();

(並固定childId列的名稱)。 調試器或簡單日志將顯示select查詢確實返回了父ID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM