执行 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 持久方式和本机过程执行方式。

我希望这对任何人都有帮助:-)