Хранимая процедура DB2 выдала синтаксические ошибки - PullRequest
0 голосов
/ 28 августа 2018

Я создаю хранимую процедуру для db2. Но это дает ошибку, говоря, что

«Ошибка SQL [42601]: обнаружен неожиданный токен« END-OF-STATEMENT » следующий "SS_TOKEN_BAK". Ожидаемые токены могут включать: «END IF». SQLCODE = -104, SQLSTATE = 42601, DRIVER = 4,23,42 ".

Ниже приводится моя хранимая процедура.

CREATE OR REPLACE PROCEDURE TOKEN_CLEANUP_SP

BEGIN

DECLARE batchSize INTEGER;

-- ------------------------------------------
-- CONFIGURABLE ATTRIBUTES
-- ------------------------------------------
SET batchSize = 10000;      -- SET BATCH SIZE FOR AVOID TABLE LOCKS    [DEFAULT : 10000]

-- ------------------------------------------------------
-- BACKUP IDN_OAUTH2_ACCESS_TOKEN TABLE
-- ------------------------------------------------------
IF EXISTS (SELECT TABLE_NAME FROM TABLES WHERE TABLE_NAME = 'IDN_OAUTH2_ACCESS_TOKEN_BAK')
THEN
    DROP TABLE IDN_OAUTH2_ACCESS_TOKEN_BAK;
END IF;     

END/

Кто-нибудь сталкивался с такой проблемой. Любая помощь по этому вопросу будет принята с благодарностью.

1 Ответ

0 голосов
/ 28 августа 2018

Убедитесь, что у вас правильно настроен разделитель конца оператора для любого инструмента, отправляющего процедуру CREATE OR REPLACE. Разные инструменты по-разному конфигурируют терминатор блока (альтернативно известный разделитель конца оператора). Для сценариев командной строки используйте - # SET TERMINATOR / в начале файла, возможны другие способы.

Ваш пример кода показывает / как терминатор блока, поэтому вы можете использовать этот символ в качестве разделителя блока. Точка с запятой завершает операторы внутри блока.

Отдельно вы должны увидеть, что ваш код не будет компилироваться, если указанная таблица не существует в подразумеваемой схеме во время компиляции, потому что вы используете статический SQL. Возможно, вы захотите использовать динамический SQL вместо оператора drop table (найдите примеры «EXECUTE IMMEDIATE»).

...