Цикл управления IBM DB2

Я перехожу с MS SQL Server на IBM DB2 (версия 9.7). Попытка написать составной цикл SQL While с локальными переменными (не частью хранимой процедуры), что-то вроде -

BEGIN ATOMIC
   DECLARE i INT DEFAULT 12;
     WHILE i > 0 
     "DO ....";
     SET COUNT = COUNT - 1;
     END WHILE;
 END

Но я получаю ошибку только в первой строке для объявления переменных-

SQL0104N  An unexpected token "12" was found following "ECLARE I INT DEFAULT". Expected tokens may include:  "END-OF-STATEMENT"

Любая помощь приветствуется.


person user455580    schedule 25.08.2015    source источник
comment
В вашем коде есть что-то вроде кучи синтаксических ошибок и необъявленных переменных. Если вы покажете свой реальный код вместо чего-то подобного, кто-то может предложить что-то вроде помощи.   -  person mustaccio    schedule 25.08.2015
comment
Фактический код, который очень близок к приведенному выше «что-то вроде» кода: BEGIN ATOMIC DECLARE i INT DEFAULT 12; WHILE i › 0 DO INSERT INTO TEMP_ITERATIONS VALUES 'IT'|| RTRIM(СИМВОЛ(СЧЁТ)); УСТАНОВИТЬ СЧЕТЧИК = СЧЕТЧИК - 1; КОНЕЦ ПОКА; КОНЕЦ   -  person user455580    schedule 25.08.2015
comment
Ну, вы объявляете i INT, но затем уменьшаете COUNT в цикле — не уверен, что понимаю здесь логику. Предложение VALUES в INSERT требует круглых скобок. Я предлагаю вам просмотреть синтаксические диаграммы в руководстве.   -  person mustaccio    schedule 25.08.2015
comment
Спасибо за указание на синтаксические ошибки. Я вставил не ту версию. Проблема в том, что я получаю ошибку в секунду, как и сам, при объявлении i. Кажется, это не идет вперед от этого. Правильная версия BEGIN ATOMIC DECLARE i INT DEFAULT 12; WHILE i › 0 DO INSERT INTO TEMP_ITERATIONS VALUES ('IT'|| RTRIM(CHAR(i))); НАБОР я = я - 1; КОНЕЦ ПОКА; КОНЕЦ   -  person user455580    schedule 25.08.2015


Ответы (1)


Я предполагаю, что ваша проблема связана с терминатором оператора (проще увидеть, указываете ли вы фактические ошибки, которые вы получаете). Я проверил следующее, и это сработало:

[ ... ]$ cat aa.sql 

CREATE TABLE TEMP_ITERATIONS ( X VARCHAR(50) ) @

BEGIN ATOMIC 
    DECLARE i INT DEFAULT 12; 
    WHILE i > 0 DO 
        INSERT INTO TEMP_ITERATIONS VALUES ('IT'|| RTRIM(CHAR(i))); 
        SET i = i - 1; 
    END WHILE; 
END @

[ ... ]$ db2 -td@ -f aa.sql

DB20000I  The SQL command completed successfully.
DB20000I  The SQL command completed successfully.

[ ... ]$ db2 "select * from TEMP_ITERATIONS"

X                                                 
--------------------------------------------------
IT12                                              
IT11                                              
IT10
[...]
12 record(s) selected.

Здесь я использовал @ как признак конца оператора, поскольку ; имеет особое значение. Если вы не хотите менять терминатор оператора, трюк состоит в том, чтобы «скрыть» ; внутри составного оператора, добавив комментарий в конце строки:

[ ... ]$ cat aa.sql 

CREATE TABLE TEMP_ITERATIONS ( X VARCHAR(50) ) ;

BEGIN ATOMIC 
    DECLARE i INT DEFAULT 12; --
    WHILE i > 0 DO 
        INSERT INTO TEMP_ITERATIONS VALUES ('IT'|| RTRIM(CHAR(i))); --
        SET i = i - 1; --
    END WHILE; --
END ;

[ ... ] db2 -tf aa.sql
DB20000I  The SQL command completed successfully.
DB20000I  The SQL command completed successfully.

[ ... ]$ db2 "select * from TEMP_ITERATIONS"

X                                                 
--------------------------------------------------
IT12                                              
IT11                                              
IT10
[...]
12 record(s) selected.
person Lennart    schedule 25.08.2015
comment
Большое спасибо. Это был терминатор, и я мог заставить его работать с обоими предложенными вами решениями! Ценить это ! - person user455580; 25.08.2015
comment
Насколько я знаю, вторая функция является недокументированной. Серж Рилау (в то время один из архитекторов DB2) упоминает об этом в этом сообщении usenet от 2004 года: groups.google.com/forum/#!topic/comp.databases.ibm-db2/ - person Lennart; 26.08.2015
comment
@ Леннарт - он говорит, что они не уберут его, потому что он сломает функцию - по меньшей мере, странная функция. - person Hogan; 26.08.2015