Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / функции на ASA 9.0 / 25 сообщений из 32, страница 1 из 2
07.10.2008, 21:16
    #35581684
Mikle83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
Есть вопрос по поводу функций в АСА (поиск по форуму не помог): проблема заключается в том, что после создания функции на чистой БД попытка сделать селект из нее заканчивается ошибкой, причем зачастую оч. непонятной по типу отсутствия поля в конечной выборке и т.д.
Теперь самое интересное: захожу в функцию ставлю в конце пробел или прросто добавляю чистую строку... компиляю процедуру и... все работает без проблем... Т.е. текст и логика функции не меняется...
Куда копать??? Что-то подсказывает, что проблема может быть в оптимизаторе, но как с этим бороться...

Данная проблема периодически появляется в разных процедурах, но от чего зависит пока не понятно...
...
Рейтинг: 0 / 0
07.10.2008, 22:06
    #35581728
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
Текст такой функции показать слабо?
...
Рейтинг: 0 / 0
08.10.2008, 08:28
    #35582001
Mikle83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
Это поможет? Вот одна из таких функций

Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
ALTER PROCEDURE "Owner"."frx_cl_InfoReport_Tab_PayDoc"
(
    in @AgreementID int             default  1 ,
    in @DateBegin   datetime        default null, --'1950-01-01',
    in @DateEnd     datetime        default null --'2050-01-01'
)
BEGIN
  Set @DateBegin      = Isnull(@DateBegin, convert(datetime, '1960-01-01'));
  Set @DateEnd        = Isnull(@DateEnd, now());
//---------------------------------------------------------------------------------------------------//
Create TABLE #RetTable
(
	TabID 		tinyint,	--1 - запись из PaymentDocuments, 2 - запись из операции по картам
	Summ		decimal( 18 , 2 ),
	NDS			decimal( 18 , 2 ),
	Doc_Date	DateTime,
	MnTarget	tinyint,
	MnType		tinyint,
	Doc_Type	integer,
	Agreement_ref	integer,
	VFOType		integer,
	ContType	integer,
	AgencyTaxRate	integer,
	ServicePercent	integer,
	SummCurCorr	decimal( 18 , 2 )
);
//---------------------------------------------------------------------------------------------------//
insert into #RetTable
(TabID, Summ, NDS, Doc_Date, MnTarget, MnType, Doc_Type,
Agreement_Ref, VFOType, ContType, AgencyTaxRate, ServicePercent)
  Select
     1  as TabID, 
	PD.Summ, PD.NDS, PD.Doc_Date, MnTarget, MnType, 
	Doc_type, PD.Agreement_Ref, VFOType, Isnull(AP.ChangeNPC, 0 ) as ContType, 
	AISC.AgencyTaxRate, AISC.ServicePercent

  from PaymentDocuments PD
    Left join AgreementParameters AP on AP.Agreement_ref = PD.Agreement_Ref
    Left join (Select * from frx__GetAgreements()) AG on AG.ID_Agreement = PD.Agreement_Ref
    Left join AgreementInfoServiceConditions AISC on  AISC.idkey = AG.ID_Condition
  where
      ((PD.Agreement_ref = @AgreementID) or (PD.Agreement_Ref in (Select IDKey from AgreementPackages where TransferTo = @AgreementID)))
      and (Doc_Date <= @DateEnd)
      and (MnTarget in ( 21 , 22 , 23 ));

insert into #RetTable
(TabID, Summ, NDS, Doc_Date, MnTarget, MnType, Doc_Type,
Agreement_Ref, VFOType, ContType, AgencyTaxRate, ServicePercent)  select
     2 , 
	GCO.Summ+ Isnull((Case 
				when ((AO.OperationType =  1 ) AND (AO.AdOperationType =  1 )) OR ((AO.OperationType =  5 ) AND (AO.AdOperationType =  2 )) then  1 
				when ((AO.OperationType =  1 ) AND (AO.AdOperationType =  2 )) OR ((AO.OperationType =  5 ) AND (AO.AdOperationType =  1 )) then - 1 
				else  0 
			   	END * AO.AdOperationSumm), 0 ) as Summ,
	GCO.NDS, GCO.OperationDate as Doc_Date, GCO.MnTarget, GCO.MnType, GCO.ID_CardOperationType as Doc_Type, GCO.ID_Agreement as Agreement_Ref, 
	GCO.PurseNo as VFOType,
    Isnull(AP.ChangeNPC,  0 ) as ContType, AISC.AgencyTaxRate, AISC.ServicePercent
  from Owner.frx__GetCardOperations (@DateBegin = '1950-01-01', @DateEnd = @DateEnd) GCO
	left join AgreementParameters AP on AP.Agreement_ref = GCO.ID_Agreement
	Left join (Select * from frx__GetAgreements()) AG on AG.ID_Agreement = GCO.ID_Agreement
	Left join AgreementInfoServiceConditions AISC on  AISC.idkey = AG.ID_Condition
	Left join mv_AdOperationsJoin AOJ on AOJ.CardOperations_Ref = GCO.ID_CardOperation
	Left join mv_AdOperations AO on AO.IdKey = AOJ.AdOperations_Ref
  where GCO.ID_Agreement in (@AgreementID, (select idkey from AgreementPackages where TransferTo = @AgreementID)) 
	AND GCO.Soft_Ref not in ( 21 , 22 )
  order by mntarget, mntype;

  Select 
    TabID, 
    Summ,
    NDS,
    Doc_Date,
    MnTarget,
    MnType,
    Doc_Type,
    Agreement_ref,
    VFOType,
    ContType,
    AgencyTaxRate,
    ServicePercent,
    SummCurCorr 
  from #RetTable;
END


Ругалась на то, что нет поля Summ... Хотя после того, как я тупо через централ добавил пустую строку, все заработало без проблем...

Причем, повторюсь, такое периодически возникает на разных процедурах/функциях...
Помогает просто добавление пробела, пустой строки и перекомпиляции (пересоздание) функции...
...
Рейтинг: 0 / 0
08.10.2008, 08:29
    #35582004
Mikle83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
О... А форматирование текста функции не прокатило исчезло
...
Рейтинг: 0 / 0
08.10.2008, 12:07
    #35582691
Dmitry..
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
что значит "на чистой БД" ?
как ты эту чистую БД создаешь?

как ты вызываешь эту процедуру?

какую именно ошибку дает сервер?
нет поля Summ где?

почему пользуешь #RetTable а не local temporary table ?
...
Рейтинг: 0 / 0
08.10.2008, 13:11
    #35582957
Mikle83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
Чистую БД создаю как угодно - хоть через скрипт Create Database, хоть через Централ на Create new database. Под "чистая" имеется ввиду только что созданная, на которой еще никаких операций не производилось, никаких объектов не создавалось не дропалось... Как еще объяснить... По-моему термин "чистая БД" уже давно в обиходе...

Вызов как угодно (хоть через Call хоть через Select) приводит к одному результату: не могу найти поле... При этом чистый запрос процедуры в Interactive SQL, партизане и т.п. и т.д. нормально возвращает результат...
"чистый запрос процедуры" - это тело процедуры скопированное в соответствующее приложение и выполненый...

Возвращает запрос ошибку по типу Column "XXX" not found.

пользую #RetTable а не local temporary table потому что так привык... Есть принципиальная разница для текущей проблемы?
...
Рейтинг: 0 / 0
08.10.2008, 13:42
    #35583094
antand
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
PaymentDocuments и Owner.frx__GetCardOperations GCO
в чистой БД создаются после вашей функции "Owner"."frx_cl_InfoReport_Tab_PayDoc"?
...
Рейтинг: 0 / 0
08.10.2008, 13:43
    #35583101
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
Какая версия сервера (с точностью до билда)?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
08.10.2008, 13:51
    #35583133
Mikle83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
PaymentDocuments и Owner.frx__GetCardOperations GCO
Создаются в скрипте до данной процедуры.

Версия: 9.0.2.3402
...
Рейтинг: 0 / 0
08.10.2008, 13:53
    #35583139
Dmitry..
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
ну если база чистая то в ней нет таблиц.
было-бы логично выдавать ошибку ;)
...
Рейтинг: 0 / 0
08.10.2008, 14:02
    #35583173
Dmitry..
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
просто предположение

поле Summ в CREATE TABLE стоит после строкового комментария.
как-бы у вас в первоначальном скрипте не стояли "неправильные" переводы кареток...
тогда поле Сумм воспринимается как закоменченое...
...
Рейтинг: 0 / 0
08.10.2008, 14:10
    #35583197
Mikle83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
Прошу всех еще раз обратить внимание на следующее:

1. скопированный текст тела процедуры корректно отрабатывает с возвращением всего необходимого.
2. внесение в тело процедуры изменения в виде пробела/чистой строки и производства alter приводит к тому, что процедура начинает работать корректно
...
Рейтинг: 0 / 0
08.10.2008, 14:12
    #35583206
Mikle83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
Специально для Dmitry :) :
на только что созданную базу (Create Database) накатывается скрипт создания всех объектов БД (таблиц, функций, процедур, вьюх, тригеров и т.д.)... Скрипт отрабатывает безошибочно. И только после этого производится попытка запустить процедуру... Прошу так же учитывать мой предыдущий пост с цлью концентрации на сути проблемы...
...
Рейтинг: 0 / 0
08.10.2008, 15:32
    #35583485
Dmitry..
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
есть информация какая именно комманда в процедуре приводит к ошибке?
...
Рейтинг: 0 / 0
08.10.2008, 15:43
    #35583526
Mikle83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
В том-то вся и проблема, что процедура корректна...
Для работы процедуры достаточно просто добавить Enter перед END и перекомпилить процедуру...

Причем это происходит периодически на разных процедурах... Зависимостей в возникновении бага не обнаружил...
...
Рейтинг: 0 / 0
08.10.2008, 18:13
    #35584007
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
Mikle83В том-то вся и проблема, что процедура корректна...
Для работы процедуры достаточно просто добавить Enter перед END и перекомпилить процедуру...
А ты пробовал открывать скрипт в режиме hexview и смотреть какие там переводы строки? Dmitry задавал правильный вопрос на который ты не ответил. Смешение \n и \r\n концов строк в исходном скрипте может приводить к недовыполненому скрипту без каких-либо сообщений об ошибках на момент выполнения скрипта. Я такое видел неоднократно на ASE, в SA я с этим не сталкивался, но чем черт не шутит. К тому же вставка пустой строки явно показывает на проблемы с чтением исходного скрипта.

Прогони скрипт в дебагере, посмотри на какой конкретно строке он падает. Потом запусти этот скрипт еще раз и когда дебагер остановится перед проблемной строкой, запусти дб-эксплорер в дебагере и покопайся в таблицах, хотя бы просто попытайся выполнить проблемную команду "как есть", она ругнется. Потом упрощай эту команду пока не перестанет ругаться. Будет шанс узнать о проблеме больше.

И не забывай ставить точку с запятой после END. Полезно будет...
...
Рейтинг: 0 / 0
08.10.2008, 19:39
    #35584156
Марсель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
я сталкивался с таким, выгружая бд для мобилинка.
попробуй описать в процедуре RESULT ( result-column, ... )
мне помогло :)
...
Рейтинг: 0 / 0
09.10.2008, 00:59
    #35584504
Анатолий Иванов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
Марселья сталкивался с таким, выгружая бд для мобилинка.
попробуй описать в процедуре RESULT ( result-column, ... )
мне помогло :)
Мы с таким сталкивались много раз, от EBFа к EBFу не лечилось. Лечится простым пересозданием процедуры/функции (что точно помогает!) или косметическим изменением и сохранением (что помогало не всегда).
...
Рейтинг: 0 / 0
09.10.2008, 08:26
    #35584617
Mikle83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
White Owl, не могу понять, как может конец строки помочь??? Ведь вставка !!!!пробела!!!! в любое место приводит процедуру в нормальное состояние...
Надо попробовать с RESULT ( result-column, ... )... Но проблема в том, что данный баг проявляется крайне не стабильно...
...
Рейтинг: 0 / 0
09.10.2008, 09:40
    #35584715
Dmitry..
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
Sybase Central для АСА автоматом заменяет все переводы кареток на правильные.
dbisql, который обычно используется для создания БД, компилит процедуры "как есть".

чтобы выявить проблему предлагаю сделать следующее:
- взять базу с проблемной процедурой.
- взять sql скрипт с помощью которого сосдавалась база
- с помощью редактора который не делает никаких авто-замен (например FAR) оставить в этом скрипте только проблемную процедуру
НЕ ДЕЛАТЬ никаких копи-паст!!! только удаление ненужного текста!!!
- заменить в новом сктипте create на alter
- запускать его только из dbisql, комманда load (если правильно помню)

если после этого запуска проблема остается - это и есть наши исходные данные.
процедуру аттачем сюда, и четко как звучит ошибка! тоже сюда.
...
Рейтинг: 0 / 0
09.10.2008, 16:10
    #35586066
Mikle83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
Совершить действия описанные в предыдущем посте не представляется возможным по ряду причин...

Вопрос ко всем: возможно ли осуществить на АСА пересохранение всех процедур... Есть ли какие-нить штатные средства для реализации этой задачи?

Т.е. хочется сделать чтонить типа EXEC RELOAD_ALL() и получить пересохранение всех процедур на базе.
...
Рейтинг: 0 / 0
09.10.2008, 16:32
    #35586160
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
Mikle83 пишет:

> Вопрос ко всем: возможно ли осуществить на АСА пересохранение всех
> процедур... Есть ли какие-нить штатные средства для реализации этой задачи?

Нет.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
09.10.2008, 18:16
    #35586490
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
Mikle83White Owl, не могу понять, как может конец строки помочь???Элементарно. Скрипт читается парсером. Парсер разбирает скрипт на отдельные слова (токены) и пытается разобрать что является настоящими командами которые надо выполнить, а что является мусором который был прислан на сервер кривым клиентом. Мешанина из \n и \r\n может убедить парсер что все что идет после первого "неправильного" перевода строки является мусором который надо игнорировать. Потом парсер встречает "правильный" перевод строки и дальше продолжает разбирать скрипт. В итоге, кусок скрипта будет просто выкинут из работы.
Теперь понял?

Mikle83Ведь вставка !!!!пробела!!!! в любое место приводит процедуру в нормальное состояние...Да, это возможно. И проявление бага будет действительно не стабильным.
...
Рейтинг: 0 / 0
09.10.2008, 19:05
    #35586588
antand
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
Можно конечно сбацать "свой" EXEC RELOAD_ALL()
который вытащит нужное из SYSPROCEDURE,
наведет там порядок с \n и \r\n и перезальет в базу
Или проще взять кусок изначального скрипта создания процедур в базе,
навести там порядок и перезалить в каждой существующей базе.
...
Рейтинг: 0 / 0
09.10.2008, 21:44
    #35586783
Mikle83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функции на ASA 9.0
WhiteOwl, спасибо за объяснение. Действительно такая ситуация быть может... Надо продебажить, как предлагал Dmitry.

Но вот смущает такой факт: избавился пока от проблемы следующим образом: каждая процедура в скрипте пересоздается по 3 раз... Т.е. делается Create Procedure. потом Drop Procedure и снова Create... Достигается это путем выполнения одного и того же скрипта несколько раз на одной базе... После этого все нормально. Процедура пашет...

antand, можно конечно взять и перезалить... но масштабы компании скажем так не позволяют этого сделать... ибо счет конечных пользователей в эксплуатации (а кадая точка имеет свою БД) идет на тысячи... поэтому пытаемся решить проблему на стадии разработки, чтобы она на эксплуатации не вылезла вдруг
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / функции на ASA 9.0 / 25 сообщений из 32, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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