Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA. Создание процедуры. Глюк? / 13 сообщений из 13, страница 1 из 1
27.01.2005, 13:00
    #32886821
Ggg_old
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA. Создание процедуры. Глюк?
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
27.01.2005, 13:03
    #32886835
Ggg_old
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA. Создание процедуры. Глюк?
Забыл добавить.
Тело процедуры запущенное в ISQL (естественно без ALTER PROCEDURE) отрабатывает.
...
Рейтинг: 0 / 0
27.01.2005, 13:11
    #32886858
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA. Создание процедуры. Глюк?
Попробуйте ради интереса написать:
Код: plaintext
1.
2.
select count(*)
into @counter
from _users;
и еще попробуй поставить последний EBF - в предыдущих (включая чистый 9.0.2) дюже много ляпов было. На этот вроде я вообще не жалуюсь.
...
Рейтинг: 0 / 0
27.01.2005, 15:12
    #32887296
Ggg_old
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA. Создание процедуры. Глюк?
2ASCRUS:
Вариант с
Код: plaintext
1.
2.
3.
select count(*)
into @counter
from _users;
помог. Как скачаю последний патч, - дам знать о результатах.
...
Рейтинг: 0 / 0
27.01.2005, 15:43
    #32887419
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA. Создание процедуры. Глюк?
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
27.01.2005, 15:52
    #32887452
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA. Создание процедуры. Глюк?
Вы ошибаетесь - в стандарте SQL разрешено присваивание переменной в формате:
Код: plaintext
SELECT @Var = Field
...
Рейтинг: 0 / 0
27.01.2005, 16:51
    #32887617
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA. Создание процедуры. Глюк?
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
27.01.2005, 17:29
    #32887733
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA. Создание процедуры. Глюк?
Никакой неоднозначности - просто нужно помнить что в ASA есть два диалекта:
1. WatcomSQL
2. TSQL
Так вот в TSQL диалекте разрешается такие вещи делать, а в WatcomSQL нет.
ASA при компиляции процедуры пытается понять, что это за диалект и компилить
по его правилам. Соотвествующе нужно в целях борьбы с такими
неоднозначностями диалектов все писать на одном диалекте - вообще
необходимость в TSQL на ASA может возникнуть только по причинам
совместимости с MSSQL или ASE, в других случаях лучше писать на WatcomSQL и
не заморачиваться (особенно если учесть убогость TSQL по сравнению с
WatcomSQL).



Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
27.01.2005, 18:31
    #32887905
Ggg_old
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA. Создание процедуры. Глюк?
Я первым делом подумал на то, что это проблемы из-за разных диалектов.
Но например такая процедурка:
Код: 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
27.01.2005, 18:56
    #32887963
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA. Создание процедуры. Глюк?
а нет ли какой-нибудь прагмы, чтобы подсказать ASA - "Мы пишем щас на TransactSQL | WatcomSQL" ???
...
Рейтинг: 0 / 0
27.01.2005, 19:33
    #32888025
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA. Создание процедуры. Глюк?
--null--а нет ли какой-нибудь прагмы, чтобы подсказать ASA - "Мы пишем щас на TransactSQL | WatcomSQL" ???
Такой прагмой обычно является заголовок функции. Вернее ключевое слово AS или BEGIN.

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

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


А begin то после as ты не забыл??? :-)
...
Рейтинг: 0 / 0
28.01.2005, 18:51
    #32890175
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA. Создание процедуры. Глюк?
Я 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
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA. Создание процедуры. Глюк? / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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