2015-08-25 4 views
0

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

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

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

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

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

+0

Ваш код имеет что-то вроде кучи синтаксических ошибок и необъявленных переменных. Если вы покажете свой фактический код вместо чего-то подобного, кто-то может предложить что-то вроде помощи. – mustaccio

+0

Фактический код, который очень близок к коду «что-то вроде» выше - BEGIN ATOMIC DECLARE i INT DEFAULT 12; WHILE i> 0 DO INSERT INTO TEMP_ITERATIONS VALUES 'IT' || RTRIM (CHAR (COUNT)); SET COUNT = COUNT - 1; END WHILE; END – user455580

+0

Ну, вы объявляете 'i INT', но затем уменьшаете' COUNT' в цикле - не уверен, что я понимаю логику здесь. Предложение 'VALUES' в' INSERT' требует скобок. Я предлагаю вам просмотреть синтаксические диаграммы в руководстве. – mustaccio

ответ

2

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

[ ... ]$ 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 [email protected] -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. 
+0

Большое спасибо. Это был терминатор, и я мог заставить его работать с обоими вашими предлагаемыми решениями! Ценить это ! – user455580

+0

AFAIK второй - недокументированная функция. Серж Риело (в то время один из архитекторов для DB2) упоминает об этом в этой статье с 2004 года: https://groups.google.com/forum/#!topic/comp.databases.ibm-db2/goEiaG3jsAI – Lennart

+0

@ Леннарт - он говорит, что они не возьмут его, потому что он сломает черту - по-прежнему странная особенность, если не сказать больше. – Hogan

 Смежные вопросы

  • Нет связанных вопросов^_^