Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 ошибка в синтаксисе ?  [new]
And-kn
Member

Откуда:
Сообщений: 55
Привет.
я нашел пример работы команды - 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>".

Что за дела, ведь это рабочий пример из мануала ?
22 июн 06, 07:15    [2800017]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в синтаксисе ?  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4949
IF заканчивайте
END IF;
, а не
END
По коду:
А у вас объявлен в процедуре CONTINUE HANDLER FOR SQLEXCEPTION
Или, по меньшей мере, для тех SQLSTATE, которые могут появиться в результате этих UPDATE?
22 июн 06, 10:06    [2800470]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в синтаксисе ?  [new]
And-kn
Member

Откуда:
Сообщений: 55
Данная процедура написана как есть в мануале db2 udb v8.2 sql cookbook
я лишь создал свою табличку с данными полями и данными.
я так понимаю, что инторпритатор показывает на неправельное обращение с глобальной переменной sqlcode в операторе If, и я так же предпологал что данный код будет работать без дополнительных конфигураций в базе или .т.п.
но вот что надо сделать, что бы данная проверка на наличие ошибки при выполнении запроса выполнялось?

З.Ы. end if - ничего не дал.
22 июн 06, 12:30    [2801533]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в синтаксисе ?  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4949
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 не так - отдельный привет аффтару!
22 июн 06, 13:01    [2801719]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в синтаксисе ?  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2550
Про 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.
22 июн 06, 13:06    [2801750]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в синтаксисе ?  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2550
(не видел письма Марка)
22 июн 06, 13:07    [2801761]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в синтаксисе ?  [new]
And-kn
Member

Откуда:
Сообщений: 55
Упс, сглупил,
я просто данный запрос пихал не в ХП, а просто из проги.
наверно дело в этом!
22 июн 06, 13:20    [2801845]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в синтаксисе ?  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4949
А вообще, такие вещи удобнее ИМХО делать так:
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 либо выполнится, либо нет.
22 июн 06, 14:06    [2802166]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в синтаксисе ?  [new]
And-kn
Member

Откуда:
Сообщений: 55
to Mark Barinstein

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

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

в чем дело ?
23 июн 06, 08:15    [2804657]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в синтаксисе ?  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2550
Наверное, у вас statement termination character неправильный, и его надо сменить с ; на @

У Control Center есть поле ввода Statement termination character внизу слева.
У Command Line Processor опция -td@
23 июн 06, 08:32    [2804681]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в синтаксисе ?  [new]
And-kn
Member

Откуда:
Сообщений: 55
Большое спосибо за помощь, все получилось, работает, но вот не могу найти созданную ХП, нигде в Центре управления, может напоследок подскажите где можно найти созданные ХП ?
23 июн 06, 09:12    [2804763]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в синтаксисе ?  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2550
Control Center: All Databases->ВашаБаза->Application Objects->Stored Procedures.
Возможно, придётся сделать refresh.
23 июн 06, 09:46    [2804870]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить