Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Команда exit в скриптах АСА 6 / 9 сообщений из 9, страница 1 из 1
22.10.2004, 15:45
    #32750827
Vadim Romanenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Команда exit в скриптах АСА 6
Есть скрипт под АСА 6. В нем есть кусочек. До которого доходит выполнение, и на нем останавливается. Вот он:
...
select nutype_id into an_unitTypeID from unittype where UCASE(vcode) = UCASE(av_unitType);
if ifnull(an_unitTypeID, -1, an_unitTypeID) = -1 then
message 'Invalid (unsupported) unit type ('+av_unitType+'). Exiting...';
exit;
end if;
...
Ошибка - Syntax error near if. Переменные объявлены выше так:
...
CREATE VARIABLE "av_unitType" VCODE;
CREATE VARIABLE "an_unitTypeID" NID;
...

В чем проблема - никак понять не могу.
ПС: Если вызвать просто:
...
if ifnull(an_unitTypeID, -1, an_unitTypeID) = -1 then
message 'Invalid (unsupported) unit type ('+av_unitType+'). Exiting...';
end if;
...
то все работает (то есть без команды exit).

Возможно ли такое, что команда exit может работать только в конце скрипта??? Бред конечно, но мало ли...
Вобщем, какие будут идеи у мирового разума?
...
Рейтинг: 0 / 0
22.10.2004, 16:01
    #32750879
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Команда exit в скриптах АСА 6
Vadim RomanenkoВозможно ли такое, что команда exit может работать только в конце скрипта??? Бред конечно, но мало ли...
Вобщем, какие будут идеи у мирового разума?
Нет - не бред, а чистая правда :) Вы не забывайте, что оператор EXIT - это оператор самого ISQL (так же как например GO), а не WatcomSQL. Соотвествующе как работает ISQL - он ищет свою команду в скрипте и выполняет до нее весь код как батч-скрипт на WatcomSQL. Получается, что оператор EXIT внутри IF режет ее пополам и в скрипте, посылаемом ASA получается ошибка. Поэтому Вам лучше сделать вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE VARIABLE retcode INT;
SET retcode =  0 ;

Start:
BEGIN
  select nutype_id 
  into an_unitTypeID 
  from unittype 
  where UCASE(vcode) = UCASE(av_unitType);

  if ifnull(an_unitTypeID, - 1 , an_unitTypeID) = - 1  
  then
    message 'Invalid (unsupported) unit type ('+av_unitType+'). Exiting...';
    SET retcode =  1 ;
    LEAVE Start;
  end if;
END;

EXIT retcode;
...
Рейтинг: 0 / 0
22.10.2004, 16:06
    #32750891
Vadim Romanenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Команда exit в скриптах АСА 6
Буду пробовать, но слово Start для имени метки - явно не подходит ;)
...
Рейтинг: 0 / 0
22.10.2004, 16:16
    #32750914
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Команда exit в скриптах АСА 6
Vadim RomanenkoБуду пробовать, но слово Start для имени метки - явно не подходит ;)
Угу, согласен, это я неподумавши написал что первое в голову пришло :)
...
Рейтинг: 0 / 0
22.10.2004, 16:22
    #32750930
Vadim Romanenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Команда exit в скриптах АСА 6
В очередной раз ASCRUS выражается благодарность :) СПАСИБО за оперативный ответ. Который еще и помог! :) Все получилось, правда начались другие грабли... Почему-то из процедуры в скрипт не вернулись OUT-переменные... Но это, как говорится, уже совсем другой вопрос :)
...
Рейтинг: 0 / 0
22.10.2004, 16:48
    #32751005
Vadim Romanenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Команда exit в скриптах АСА 6
Э-э-э... Не знаю, стоит ли выносить в отдельный вопрос...
Но вот в связи с этим добавлением begin...end появились новые грабли...
Почему-то при вызове процедур из блока begin...end не возвращаются OUT-переменные!!! Что за зверь такой??
Вот так произвожу вызов:
...
// // Call the procedures
//procedure z_p_PointIns(an_npcat, av_vcode, av_vname, av_dbegin, av_end, OUT an_ret, OUT av_ret);
CALL "DBA"."z_p_PointIns"( null, av_pointCode, av_pointName, av_pointBegin, '31/12/2999', an_ret, av_ret);
message 'z_p_PointIns executed. Result - ' + cast(an_ret as varchar(10)) + ', ' + ifnull(av_ret, ' --', av_ret);
if an_ret < 0 then
message 'Exiting...';
Leave Scp;
end if;
...
Так вот! В журнал выносятся те значения an_ret и av_ret, которыми я их проинициализировал!! Ну или не проинициализировал :) Причем, при выполнении без begin...end все выводится в лог нормально...
Что эт за новость такая??
...
Рейтинг: 0 / 0
22.10.2004, 16:59
    #32751039
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Команда exit в скриптах АСА 6
Попробуйте вместо CREATE VARIABLE Ваших переменных, участвующих только в блоке BEGIN-END использовать локальные переменные, обьявляя их прямо в блоке:
Код: plaintext
1.
2.
3.
BEGIN
  DECLARE an_ret int;
  ...
END;
И вообще не увлекайтесь глобальными переменными, помните что их видно везде и они в любом месте кода могут быть изменены.

авторprocedure z_p_PointIns(an_npcat, av_vcode, av_vname, av_dbegin, av_end, OUT an_ret, OUT av_ret);
В ASA если у параметра не указан его тип, то он определяется по умолчанию как INOUT. Рекомендую всегда ставить перед такими параметрами IN, иначе потом можно наступить на множество граблей :)
...
Рейтинг: 0 / 0
22.10.2004, 17:08
    #32751059
Vadim Romanenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Команда exit в скриптах АСА 6
По поводу INOUT - я всегда указываю тип переменных. То просто комментарий, чтоб не забыть описание процедуры. Для себя. А поскольку я никогда не использую INOUT (не знаю почему :)), то для экономии места я повырезал типы и IN...
Вот на самом деле описание ф-ции:
procedure "dba".z_p_PointIns(IN an_npcat NID, IN av_vcode VCODE, IN av_vname VNAME, IN av_dbegin varchar(10), IN av_end varchar(10), OUT an_ret integer, OUT av_ret VNOTE)

А по поводу CREATE VARIABLE и DECLARE... Это вообще мой первый скрипт, и я за основу взял пример, который генерит Sybase Central по команде Test at Interactive SQL на какой-нить ф-ции или процедуре :) И просто, если честно, не думал, что есть еще и куча всяких возможностей по объявлению переменных... Не дошли руки до почитать доку...

Спасибо за совет - попробую сейчас перенести переменные в begin...end
...
Рейтинг: 0 / 0
22.10.2004, 17:36
    #32751115
Vadim Romanenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Команда exit в скриптах АСА 6
Вобщем, все получилось :)
Заменил CREATE VARIABLE на Declare внутри begin...end - и о счастье! Все заработало :) Очередное спасибо!
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Команда exit в скриптах АСА 6 / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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