Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / ошибка в синтаксисе ? / 12 сообщений из 12, страница 1 из 1
22.06.2006, 07:15
    #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
22.06.2006, 10:06
    #33807679
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка в синтаксисе ?
IF заканчивайте
Код: plaintext
END IF;
, а не
Код: plaintext
END
По коду:
А у вас объявлен в процедуре CONTINUE HANDLER FOR SQLEXCEPTION
Или, по меньшей мере, для тех SQLSTATE, которые могут появиться в результате этих UPDATE?
...
Рейтинг: 0 / 0
22.06.2006, 12:30
    #33808285
And-kn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка в синтаксисе ?
Данная процедура написана как есть в мануале db2 udb v8.2 sql cookbook
я лишь создал свою табличку с данными полями и данными.
я так понимаю, что инторпритатор показывает на неправельное обращение с глобальной переменной sqlcode в операторе If, и я так же предпологал что данный код будет работать без дополнительных конфигураций в базе или .т.п.
но вот что надо сделать, что бы данная проверка на наличие ошибки при выполнении запроса выполнялось?

З.Ы. end if - ничего не дал.
...
Рейтинг: 0 / 0
22.06.2006, 13:01
    #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
22.06.2006, 13:06
    #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
22.06.2006, 13:07
    #33808444
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка в синтаксисе ?
(не видел письма Марка)
...
Рейтинг: 0 / 0
22.06.2006, 13:20
    #33808496
And-kn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка в синтаксисе ?
Упс, сглупил,
я просто данный запрос пихал не в ХП, а просто из проги.
наверно дело в этом!
...
Рейтинг: 0 / 0
22.06.2006, 14:06
    #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
23.06.2006, 08:15
    #33810357
And-kn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка в синтаксисе ?
to Mark Barinstein

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

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

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

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


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