我有一个使用JBoss 5.1在Java 6上编写的后端服务器。我必须将该代码上的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()
时出现问题。该调用会阻止执行,无法继续正常执行并保留数据。
有必要说这个程序正常执行插入数据到基于第三个表的另一个表中,我在其中先插入了正常类创建的数据和{{1 }和EntityManager.persist(<entity>)
。
这不是授予权限问题,因为我可以使用正确的句子和正确的用户/密码在 SQLDeveloper 上执行该过程。
答案 0 :(得分:0)
最后我发现了什么问题。您不能同时使用EntityManager来持久保存实体,然后执行您必须本机调用的过程。因此,解决方案是本机地保留我的实体(通过插入,使用PreparedStatemnt
);
"Insert into <table> (<column1>, <column2>,...,<columnN>) values (?, ?,...,?)"
然后以正确的方式执行该程序:
"{call <user>.<package>.<procedure_name>(?,?,?,?,?,?,?,?,?)}"
原因似乎是你不能以两种不同的执行方式执行相同的@Transactional
方法:EntityManager persist-way和native procedure execution-way。
我希望这可以帮助任何人: - )