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

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

Код: 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
функции на ASA 9.0
    #35582004
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О... А форматирование текста функции не прокатило исчезло
...
Рейтинг: 0 / 0
функции на ASA 9.0
    #35582691
Dmitry..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
что значит "на чистой БД" ?
как ты эту чистую БД создаешь?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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