Странное поведение JDBC executeBatch

Я пытаюсь выполнить callablestatement для хранимой процедуры (не функции, а процедуры) в Postgresql 11.

Я создаю партию, готовую к исполнению, вот так:

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), но скорее это должно быть выдача оператора "CALL", даже если в моей строке CallableStatement есть "{call insertnewrecall (?,? ...}"

Я схожу с ума, пытаясь понять, был ли это я или текущий драйвер JDBC не обновлен, чтобы учесть возможность вызова процедуры сейчас, а не функции.

Есть ли у кого-нибудь опыт работы с этим и может ли кто-нибудь пролить свет или указать мне на какую-то документацию, которую я еще не прочитал?

Ваше здоровье

Хорошо, я так же запутался, А.Ф. Я наткнулся на (ibm.com/support/knowledgecenter/SSEPEK_10.0.0/java/src/tpc/‌…) и смотрел на их оператор вызова: cstmt = con.prepareCall ("CALL DSN8.DSN8ED2 (?,?,?,?,?)"); У меня создалось впечатление, что оператор вызова должен выглядеть так: cstmt = con.prepareCall ("{CALL DSN8.DSN8ED2 (?,?,?,?,?)}"); - обратите внимание на фигурные скобки. Излишне говорить, что инструкция БЕЗ фигурных скобок работает отлично. Может кто подскажет в чем разница? Большое спасибо

Darren Smith 01.11.2018 10:42

Один с фигурными скобками - это escape-код JDBC, который драйвер переводит в формат, специфичный для базы данных, а другой напрямую отправляется на сервер без перевода.

Mark Rotteveel 02.11.2018 10:18

Спасибо, MarkRotteveel. Я понятия не имел, что это было так! Большое спасибо!!

Darren Smith 03.11.2018 11:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
114
0

Другие вопросы по теме