powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA. Создание процедуры. Глюк?
13 сообщений из 13, страница 1 из 1
ASA. Создание процедуры. Глюк?
    #32886821
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASA9 WinXP v9.0.2.2542
Написал и отладил в ISQL скрипт. КОгда я этот скрипт попытался оформить в хранимку, при сохранении получаю ошибку Syntax error near temporary on line 3. Путем научного тыка я определил, какой фрагмент кода (отнюдь не line 3) влияет на появление этой ошибки, но почему она возникает понять не могу.
Для воссоздания ситуации я сильно упростил логику скрипта.
Итак:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
ALTER PROCEDURE "DBA"."test"( )
BEGIN
	declare local temporary table _users
	(
		user_id int not null,
		user_fio varchar( 34 )		
	) not transactional;
	
	declare @user_id int;
	declare @user_fio varchar( 34 );	
	declare @counter int;
	
	declare cur_users
	cursor for
		select user_id, user_fio			
		from _users			
		for read only;
	
	open cur_users;
	
	fetch next cur_users
	into @user_id, @user_fio;
	
	while @@fetch_status= 0  loop
		select @counter=count(*) from _users;					
		fetch next cur_users
		into @user_id, @user_fio;
	end loop;		
	close cur_users;
END
Скрипт успешно сохраняется, если убрать строку:
Код: plaintext
1.
select @counter=count(*) from _users;
...
Рейтинг: 0 / 0
ASA. Создание процедуры. Глюк?
    #32886835
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл добавить.
Тело процедуры запущенное в ISQL (естественно без ALTER PROCEDURE) отрабатывает.
...
Рейтинг: 0 / 0
ASA. Создание процедуры. Глюк?
    #32886858
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте ради интереса написать:
Код: plaintext
1.
2.
select count(*)
into @counter
from _users;
и еще попробуй поставить последний EBF - в предыдущих (включая чистый 9.0.2) дюже много ляпов было. На этот вроде я вообще не жалуюсь.
...
Рейтинг: 0 / 0
ASA. Создание процедуры. Глюк?
    #32887296
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ASCRUS:
Вариант с
Код: plaintext
1.
2.
3.
select count(*)
into @counter
from _users;
помог. Как скачаю последний патч, - дам знать о результатах.
...
Рейтинг: 0 / 0
ASA. Создание процедуры. Глюк?
    #32887419
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ggg_old2ASCRUS:
Вариант с
Код: plaintext
1.
2.
3.
select count(*)
into @counter
from _users;
помог. Как скачаю последний патч, - дам знать о результатах.
Патч ни причем. Это просто ошибка (кстати, не приведен текст ошибки)
Присваивать можно либо так:
Код: plaintext
1.
-- стиль Transact SQL
select count(*) into @counter from _users;
либо так
Код: plaintext
1.
2.
-- стиль Watcom-SQL
SET @counter=(SELECT count(*) from _users);

А твой запрос
Код: plaintext
1.
2.
-- стиль Watcom-SQL
select @counter=count(*) from _users

эквивалентен
Код: plaintext
1.
2.
-- стиль Transact SQL
select count(*) AS @counter from _users
...
Рейтинг: 0 / 0
ASA. Создание процедуры. Глюк?
    #32887452
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы ошибаетесь - в стандарте SQL разрешено присваивание переменной в формате:
Код: plaintext
SELECT @Var = Field
...
Рейтинг: 0 / 0
ASA. Создание процедуры. Глюк?
    #32887617
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSВы ошибаетесь - в стандарте SQL разрешено присваивание переменной в формате:
Код: plaintext
SELECT @Var = Field


Тем не менее SELECT Var=1 - это запрос, возвращающий одну запись
с полем Var и значением 1.
Так же как и SELECT 1 as Var

И если в ASA 8.0.3 попробовать сделать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE FUNCTION DBA.testfunc ( /* parameter, ... */ )
RETURNS integer
DETERMINISTIC
BEGIN
	DECLARE @result integer;
	SELECT @result= 123 ;
	RETURN @result;
END
заругается на слово FUNCTION. Если убрать SELECT, то не ругается

Процедура:
Код: plaintext
1.
2.
3.
4.
5.
CRAETE PROCEDURE DBA."test2" ( /* parameter, ... */ )
BEGIN
    DECLARE var integer;
	SELECT var= 1 ;
END

тоже вернет запись с var=1

А эта -
Код: plaintext
1.
2.
3.
4.
5.
CRAETE PROCEDURE DBA."test3" ( /* parameter, ... */ )
BEGIN
    DECLARE @var integer;
	SELECT @var= 1 ;
END
ничего не вернет.

Неоднозначность. Но лень сейчас выискивать разруливание этих собачек
в документации. Это как скобки в IF в паскале - лучше поставить лишние
с запасом, чтоб не было сомнения. Точно так же и в любом софте - не
оставляйте шансов для ошибок.
...
Рейтинг: 0 / 0
ASA. Создание процедуры. Глюк?
    #32887733
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никакой неоднозначности - просто нужно помнить что в ASA есть два диалекта:
1. WatcomSQL
2. TSQL
Так вот в TSQL диалекте разрешается такие вещи делать, а в WatcomSQL нет.
ASA при компиляции процедуры пытается понять, что это за диалект и компилить
по его правилам. Соотвествующе нужно в целях борьбы с такими
неоднозначностями диалектов все писать на одном диалекте - вообще
необходимость в TSQL на ASA может возникнуть только по причинам
совместимости с MSSQL или ASE, в других случаях лучше писать на WatcomSQL и
не заморачиваться (особенно если учесть убогость TSQL по сравнению с
WatcomSQL).



Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
ASA. Создание процедуры. Глюк?
    #32887905
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я первым делом подумал на то, что это проблемы из-за разных диалектов.
Но например такая процедурка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
ALTER PROCEDURE "DBA"."ttt"
BEGIN
declare @a int;
	declare @b int;
	set @a= 1 ;	
	select @b=count(*) from dummy;
END;
успешно сохраняется. Т.е смешанный текст TSQL и WSQL проходит нормально.
Но если добавить объявление например временной таблицы через declare local temporary table - и процедура уже не сохранится. Итого выходит, что проверщик диалекта sql не до конца строгий.
...
Рейтинг: 0 / 0
ASA. Создание процедуры. Глюк?
    #32887963
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а нет ли какой-нибудь прагмы, чтобы подсказать ASA - "Мы пишем щас на TransactSQL | WatcomSQL" ???
...
Рейтинг: 0 / 0
ASA. Создание процедуры. Глюк?
    #32888025
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--а нет ли какой-нибудь прагмы, чтобы подсказать ASA - "Мы пишем щас на TransactSQL | WatcomSQL" ???
Такой прагмой обычно является заголовок функции. Вернее ключевое слово AS или BEGIN.

Watcom:
create procedure aaaa
begin
declare ....
select ...
end;

Transact:
create procedure aaaa as
declare ....
select ...
end;
...
Рейтинг: 0 / 0
ASA. Создание процедуры. Глюк?
    #32888480
Я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Я
Гость
White Owl
Transact:
create procedure aaaa as
declare ....
select ...
end


А begin то после as ты не забыл??? :-)
...
Рейтинг: 0 / 0
ASA. Создание процедуры. Глюк?
    #32890175
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я White Owl
Transact:
create procedure aaaa as
declare ....
select ...
end


А begin то после as ты не забыл??? :-)
Нет, не забыл. Там не нужен begin. Это специфическое отличие Transact диалекта.
Можешь сходить в BOL и сам прочитать, там даже примеры есть с которыми можно поиграться.

ASA SQL Reference
SQL Statements
CREATE PROCEDURE statement [T-SQL]

Вот один абзац оттуда:
Procedure body The body of a Transact-SQL procedure is a list of Transact-SQL statements prefixed by the AS keyword. The body of a Watcom-SQL procedure is a compound statement, bracketed by BEGIN and END keywords.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA. Создание процедуры. Глюк?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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