执行 CallableStatement 块应用程序
Execute a CallableStatement blocks the application
我有一个写在 Java 6 上的后端服务器,带有 JBoss 5.1。我必须将该代码上的 Oracle 过程(存储在包中)调用到如下方法中:
cs = conn.prepareCall("{call <user>.<package>.<procedure_name>(?,?,?,?,?,?,?,?,?)}");
cs.setString(1, <data>);
cs.setString(2, <data>);
cs.setString(3, <data>);
cs.setDate(4, <data>);
cs.setString(5, <data>);
cs.registerOutParameter(6, Types.VARCHAR);
cs.registerOutParameter(7, Types.VARCHAR);
cs.registerOutParameter(8, Types.BIGINT);
cs.setInt(9, <data>);
try{
cs.execute();
}catch (RuntimeException e){
e.getMessage();
}catch (Exception e){
e.getMessage();
}
Long numerr = cs.getLong(8);
调用cs.execute()
时出现问题。该调用会阻止执行,无法继续正常执行和持久化数据。
不得不说这个程序正常执行 insert data into another tables based on third table which I insert previously the data使用正常的 class 创建以及 EntityManager.persist(<entity>)
和 EntityManager.flush()
.
这不是 授予权限 的问题,因为我可以在 SQLDeveloper 上用正确的语句和正确的 User/password.
终于发现问题所在了。您不能同时使用 EntityManager 来持久化一个实体,然后再执行您必须本地调用的过程。所以解决方案是本地保留我的实体(通过插入,使用 PreparedStatemnt
);
"Insert into <table> (<column1>, <column2>,...,<columnN>) values (?, ?,...,?)"
然后以正确的方式执行程序:
"{call <user>.<package>.<procedure_name>(?,?,?,?,?,?,?,?,?)}"
原因似乎是您不能在同一 @Transactional
方法中执行两种不同的执行方式:EntityManager 持久方式和本机过程执行方式。
我希望这对任何人都有帮助:-)
我有一个写在 Java 6 上的后端服务器,带有 JBoss 5.1。我必须将该代码上的 Oracle 过程(存储在包中)调用到如下方法中:
cs = conn.prepareCall("{call <user>.<package>.<procedure_name>(?,?,?,?,?,?,?,?,?)}");
cs.setString(1, <data>);
cs.setString(2, <data>);
cs.setString(3, <data>);
cs.setDate(4, <data>);
cs.setString(5, <data>);
cs.registerOutParameter(6, Types.VARCHAR);
cs.registerOutParameter(7, Types.VARCHAR);
cs.registerOutParameter(8, Types.BIGINT);
cs.setInt(9, <data>);
try{
cs.execute();
}catch (RuntimeException e){
e.getMessage();
}catch (Exception e){
e.getMessage();
}
Long numerr = cs.getLong(8);
调用cs.execute()
时出现问题。该调用会阻止执行,无法继续正常执行和持久化数据。
不得不说这个程序正常执行 insert data into another tables based on third table which I insert previously the data使用正常的 class 创建以及 EntityManager.persist(<entity>)
和 EntityManager.flush()
.
这不是 授予权限 的问题,因为我可以在 SQLDeveloper 上用正确的语句和正确的 User/password.
终于发现问题所在了。您不能同时使用 EntityManager 来持久化一个实体,然后再执行您必须本地调用的过程。所以解决方案是本地保留我的实体(通过插入,使用 PreparedStatemnt
);
"Insert into <table> (<column1>, <column2>,...,<columnN>) values (?, ?,...,?)"
然后以正确的方式执行程序:
"{call <user>.<package>.<procedure_name>(?,?,?,?,?,?,?,?,?)}"
原因似乎是您不能在同一 @Transactional
方法中执行两种不同的执行方式:EntityManager 持久方式和本机过程执行方式。
我希望这对任何人都有帮助:-)