Вызов HSQLDB хранимой процедуры приводит к ошибке разрешения - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть Java-приложение на основе Spring, которое вставляет огромный набор записей в транзакцию с бэкэндом HSQLDB dbms. Чтобы уменьшить количество циклов обработки для генерации первичных ключей для вставляемых записей, у меня была идея создать хранимую процедуру, которая генерирует первичные ключи, которые будут использоваться в качестве идентификаторов перед выполнением вставки. Поэтому я создал хранимую процедуру со следующим кодом:

CREATE PROCEDURE GET_GENERATED_PKS_SEQ_VALUES(
     IN NUMBEROFIDS INTEGER,
     OUT GENERATEDID NUMERIC ARRAY)
     BEGIN ATOMIC
      DECLARE GENID NUMERIC ARRAY;
      DECLARE COUNTER INTEGER DEFAULT 1;
      WHILE COUNTER <= NUMBEROFIDS DO
       SET GENID[COUNTER] = NEXT VALUE FOR GENERATE_PKS_SEQ;
      END WHILE;
      SET GENERATEDID = GENID;
     END;

Существует последовательность GENERATE_PKS_SEQ, которая уже существует для генерации уникальных идентификаторов для вставляемых записей. Эта хранимая процедура ожидает числового ввода (NUMBEROFIDS) для определения количества ключей, которые будут сгенерированы.

Если я выполню этот оператор для СОЗДАНИЯ хранимой процедуры в менеджере баз данных HSQLDB (приложение Swing), все будет нормально. То есть при выполнении оператора ошибки не возникает.

После создания хранимой процедуры я пытаюсь получить к ней доступ, чтобы проверить вывод. В общем, я выполняю следующий commnand в менеджере баз данных HSQLDB:

call GET_GENERATED_PKS_SEQ_VALUES(10);

Так что я просто хочу создать 10 первичных ключей, используя упомянутую последовательность. Результатом оператора является следующее сообщение об ошибке: введите описание изображения здесь

Я не знаю, почему произошла ошибка разрешения на выполнение хранимой процедуры. Я создал хранимую процедуру с той же учетной записью пользователя, которая вызывала процедуру с указанным параметром. Версия СУБД HSQL - hsqldb-2.4.0. Кто-нибудь знает о моей ошибке? Что не так?

1 Ответ

0 голосов
/ 08 сентября 2018

Поскольку процедура имеет два параметра, вы должны вызывать ее с двумя параметрами.

Для тестов вы можете использовать DECLARE TESTVAR NUMERIC ARRAY, затем использовать call GET_GENERATED_PKS_SEQ_VALUES(10, TESTVAR)

В Java-программеВторой параметр должен быть ? и извлекаться с использованием метода getArray() класса JDBC CallableStatement.

...