JDBC executeBatch异常行为

时间:2018-11-01 07:15:21

标签: java postgresql stored-procedures jdbc

我试图在Postgresql 11的存储过程(不是函数-而是过程)上执行callablestatement。

我创建了一个准备执行的批处理,如下所示:

int[] results;
final int batchsize = 1000;

CallableStatement Stmt = null;

final int batchsize = 1000;

String execString = "{call insertnewrecall(?,?,?,?,?,?,?,?,?,?,?,?,?)}";
Stmt = conn.prepareCall(execString);

        for (RecallType recall : recallList) {

            Stmt.setInt(1, recall.getReportid());
            Stmt.setInt(2, recall.getInternalid());
            Stmt.setString(3, recall.getPatsurname());
            Stmt.setString(4, recall.getPatfirstname());
            Stmt.setString(5, recall.getPatdob());
            Stmt.setString(6, recall.getPatmobile());
            Stmt.setString(7, recall.getPatemail());
            Stmt.setString(8, recall.getDrfirstname());
            Stmt.setString(9, recall.getDrsurname());
            Stmt.setString(10, recall.getTestname());
            Stmt.setString(11, recall.getCheckdate());
            Stmt.setString(12, recall.getSource());
            Stmt.setString(13, recall.getRecalltype());


            Stmt.addBatch();

            if(++count % batchsize == 0){
                results = Stmt.executeBatch();
            }
        }


        results = Stmt.executeBatch();

存储过程为:

create or replace procedure insertnewrecall(
                                                    in p_reportid       int,
                                                    IN p_internalid     int,
                                                    IN p_patsurname     varchar(100),
                                                    IN p_patfirstname   varchar(100),
                                                    IN p_patdob         varchar(100),
                                                    IN p_patmobile      varchar(100),
                                                    IN p_patemail       varchar(100),
                                                    IN p_drfirstname    varchar(100),
                                                    IN p_drsurname      varchar(100),
                                                    IN p_testname       varchar(100),
                                                    IN p_checkdate      varchar(100),
                                                    IN p_source         varchar(100),
                                                    IN p_recalltype     varchar(100)) 
as $$
declare lv_checkdate recallqueue.checkdate%type;
begin 
.....

我可以在命令行上调用并插入新行,并且在将数据输入到表中的同时,它似乎运行得很好

当我尝试通过Postgresql JDBC驱动程序(版本42.2.5)调用该过程时,它始终抛出错误:

SQLException: Batch entry 0 select * from insertnewrecall
 Hint: To call a procedure, use CALL.

在我看来,JDBC驱动程序似乎正在尝试通过'SELECT'语句执行存储过程,这与函数的执行是一致的(基于我对PostgreSQL在线文档的阅读)即使我的CallableStatement字符串包含“ {call insertnewrecall(?,?...}“

,也应该发出” CALL“语句

在这里我要疯了,要弄清楚是不是我自己,或者当前的JDBC驱动程序尚未更新以说明现在可以调用过程而不是函数的能力。

有没有人对此有任何经验,可以阐明一些观点,或者向我指出一些我尚未阅读的文档?

欢呼

0 个答案:

没有答案