powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / ошибка в синтаксисе ?
12 сообщений из 12, страница 1 из 1
ошибка в синтаксисе ?
    #33807375
And-kn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.
я нашел пример работы команды - savepoint
а он не фунциклирует, вид:

SAVEPOINT before_updates ON ROLLBACK RETAIN CURSORS;
UPDATE savings_account
SET balance = balance - 100
WHERE cust# = 1234;
IF SQLCODE <> 0 THEN
ROLLBACK TO SAVEPOINT before_updates;
ELSE
UPDATE checking_account
SET balance = balance + 100
WHERE cust# = 1234;
IF SQLCODE <> 0 THEN
ROLLBACK TO SAVEPOINT before_updates;
END
END
COMMIT;
----------------------
так вот в строке
IF SQLCODE <> 0 THEN - выдает ошибку:
sql0104n обнаружен неправельный элемент "IF SQLCODE <> 0 THEN " после текста "begin-of-statement". список правельных элементов: "<space>".

Что за дела, ведь это рабочий пример из мануала ?
...
Рейтинг: 0 / 0
ошибка в синтаксисе ?
    #33807679
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IF заканчивайте
Код: plaintext
END IF;
, а не
Код: plaintext
END
По коду:
А у вас объявлен в процедуре CONTINUE HANDLER FOR SQLEXCEPTION
Или, по меньшей мере, для тех SQLSTATE, которые могут появиться в результате этих UPDATE?
...
Рейтинг: 0 / 0
ошибка в синтаксисе ?
    #33808285
And-kn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Данная процедура написана как есть в мануале db2 udb v8.2 sql cookbook
я лишь создал свою табличку с данными полями и данными.
я так понимаю, что инторпритатор показывает на неправельное обращение с глобальной переменной sqlcode в операторе If, и я так же предпологал что данный код будет работать без дополнительных конфигураций в базе или .т.п.
но вот что надо сделать, что бы данная проверка на наличие ошибки при выполнении запроса выполнялось?

З.Ы. end if - ничего не дал.
...
Рейтинг: 0 / 0
ошибка в синтаксисе ?
    #33808414
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE PROCEDURE SAVEPT()
LANGUAGE SQL
BEGIN
  DECLARE SQLCODE INT;
  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
  SAVEPOINT before_updates ON ROLLBACK RETAIN CURSORS;
  UPDATE savings_account
  SET balance = balance -  100 
  WHERE cust# =  1234 ;
  IF SQLCODE <>  0  THEN
    ROLLBACK TO SAVEPOINT before_updates;
  ELSE
    UPDATE checking_account
    SET balance = balance +  100 
    WHERE cust# =  1234 ;
    IF SQLCODE <>  0  THEN
      ROLLBACK TO SAVEPOINT before_updates;
    END IF;
  END IF;
  COMMIT;
END@
Вот так примерно должно быть.
А IF надо закрывать END IF;
Если в этой sql cookbook не так - отдельный привет аффтару!
...
Рейтинг: 0 / 0
ошибка в синтаксисе ?
    #33808436
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про END IF см. здесь
http://publib.boulder.ibm.com/infocenter/db2luw/v8/topic/com.ibm.db2.udb.doc/admin/r0005649.htm
db2ae2e81.pdf
SQLCODE and SQLSTATE variables in SQL procedures

To help debug your SQL procedures, you might find it useful to insert the value of the SQLCODE and SQLSTATE into a table at various points in the SQL procedure, or to return the SQLCODE and SQLSTATE values in a diagnostic string as an OUT
parameter. To use the SQLCODE and SQLSTATE values, you must declare the following SQL variables in the SQL procedure body: DECLARE SQLCODE INTEGER DEFAULT 0; DECLARE SQLSTATE CHAR(5) DEFAULT ‘00000’; DB2® implicitly sets these variables whenever a statement is executed. If a statement raises a condition for which a handler exists, the values of the SQLSTATE and SQLCODE variables are available at the beginning of the handler execution. However, the variables are reset as soon as the first statement in the handler is executed. Therefore, it is common practice to copy the values of SQLSTATE and SQLCODE into local variables in the first statement of the handler. In the following example, a CONTINUE handler for any condition is used to copy the SQLCODE variable into another variable named retcode. The variable retcode can then be used in the executable statements to control procedural logic, or pass the value back as an output parameter.

BEGIN
DECLARE SQLCODE INTEGER DEFAULT 0;
DECLARE retcode INTEGER DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND SET retcode = SQLCODE;
executable-statements
END

Note:

When you access the SQLCODE or SQLSTATE variables in an SQL procedure, DB2 sets the value of SQLCODE to 0 and SQLSTATE to ‘00000’ for the subsequent statement.
...
Рейтинг: 0 / 0
ошибка в синтаксисе ?
    #33808444
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(не видел письма Марка)
...
Рейтинг: 0 / 0
ошибка в синтаксисе ?
    #33808496
And-kn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс, сглупил,
я просто данный запрос пихал не в ХП, а просто из проги.
наверно дело в этом!
...
Рейтинг: 0 / 0
ошибка в синтаксисе ?
    #33808737
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вообще, такие вещи удобнее ИМХО делать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE PROCEDURE SAVEPT()
LANGUAGE SQL
BEGIN
  --SOME CODE
  BEGIN 
    DECLARE EXIT HANDLER FOR SQLEXCEPTION 
    BEGIN 
      ROLLBACK TO SAVEPOINT before_updates;
    END;
    SAVEPOINT before_updates ON ROLLBACK RETAIN CURSORS;
    UPDATE savings_account
    SET balance = balance -  100 
    WHERE cust# =  1234 ;
    UPDATE checking_account
    SET balance = balance +  100 
    WHERE cust# =  1234 ;
  END;
  --SOME CODE
END@
Не надо будет после каждой команды проверять, отвалилась ли она или нет.
Все, что между внутренним блоком BEGIN ... END либо выполнится, либо нет.
...
Рейтинг: 0 / 0
ошибка в синтаксисе ?
    #33810357
And-kn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Mark Barinstein

у меня встречная проблема:
я пробовал выполнить ваш запрос в Центре управления DB2, в редакторе команд, но инторпритатор ругаеться на команды описание переменных -
DECLARE SQLCODE INT;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;

а так же на конструкцию IF ELSE END IF

в чем дело ?
...
Рейтинг: 0 / 0
ошибка в синтаксисе ?
    #33810375
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное, у вас statement termination character неправильный, и его надо сменить с ; на @

У Control Center есть поле ввода Statement termination character внизу слева.
У Command Line Processor опция -td@
...
Рейтинг: 0 / 0
ошибка в синтаксисе ?
    #33810431
And-kn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спосибо за помощь, все получилось, работает, но вот не могу найти созданную ХП, нигде в Центре управления, может напоследок подскажите где можно найти созданные ХП ?
...
Рейтинг: 0 / 0
ошибка в синтаксисе ?
    #33810505
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Control Center: All Databases->ВашаБаза->Application Objects->Stored Procedures.
Возможно, придётся сделать refresh.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / ошибка в синтаксисе ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]