【发布时间】:2011-07-12 18:34:41
【问题描述】:
假设我有以下代码
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。
谢谢
【问题讨论】:
-
请贴出真实代码。您发布的代码无法编译
-
嗨,该代码只是我想要实现的一个示例。
-
因为它不是真正的代码,所以很难判断异常来自哪里。例如,您的 insertChild 查询要插入三列,并插入 4 个值。您在 addTransactionRecord 上执行更新,甚至没有声明。所有这些都可能是您真实代码中的错误,但由于我们没有,我们无法判断。
-
抱歉,我已修正错别字。异常发生在 addChildStmt.executeUpdate(insertChild) 期间。原因是 if(rs.next()) 永远不会返回 true。我要问的是为什么我不能从同一会话中读取我没有提交的行。谢谢
标签: java oracle jdbc oracle10g session-state