powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Кеширование функций и процедур
9 сообщений из 9, страница 1 из 1
Кеширование функций и процедур
    #34244900
Егор Комов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть функция
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
ALTER FUNCTION "DBA"."xp_t2"()
RETURNS long varchar
NOT DETERMINISTIC
BEGIN
	DECLARE "de1" long varchar;
	DECLARE "de2" long varchar;
             select top  1   "IR_PAyload" into de1 from DE_InReg where ir_num = TRUNCNUM(rand(*)* 3000 , 0 )  ORDER BY ir_num;
	select current time into de2;
              SET    de1=cast (de2 as text)||cast (de1 as text);
             RETURN "de1";
   
END

ir_num - PK, autoincrement
"IR_PAyload" - тип xml,

При запуске из централа - каждый раз полностью разный результат, все как положенно.

Если эту функцию опубликовать как WebService - то меняется только время (de2), de1 всегда одно и тоже! То есть закешировав select, повторно он во время вызова не генерируется!

Как с этим бороться?
...
Рейтинг: 0 / 0
Кеширование функций и процедур
    #34244911
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не знаю какая субд, но наличие rand() наводит на мысль, что каждый раз в качестве аргумента нужно дать произвольное значение: например... кол-во миллисекунд... из централа у вас постоянный коннект вот оно и генерит разные но одни и те же последоватльности... через веб у вас же коннект не persistent, так? вот он и начинает каждый раз с одной и той же цифры...
все ИМХО
...
Рейтинг: 0 / 0
Кеширование функций и процедур
    #34244918
Егор Комов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изврещения типа TOP 1 ... order by появились в процессе заставить ASA повторно запускать select, без них результат такой же.
ASA 9.0.2 , последний ebf.
...
Рейтинг: 0 / 0
Кеширование функций и процедур
    #34244938
Егор Комов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Рыжий Котне знаю какая субд, но наличие rand() наводит на мысль, что каждый раз в качестве аргумента нужно дать произвольное значение: например... кол-во миллисекунд... из централа у вас постоянный коннект вот оно и генерит разные но одни и те же последоватльности... через веб у вас же коннект не persistent, так? вот он и начинает каждый раз с одной и той же цифры...
все ИМХО

Для того, что бы Random давал фиксированную последовательноть, ему надо указать число в качестве параметра. Если ему не указывать - это совершенно случайное число.
Сейчас проверил, указание в качестве параметра числа для ws не меняет ничего...
...
Рейтинг: 0 / 0
Кеширование функций и процедур
    #34244956
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Егор Комов

странно...
выполнил select rand(*) несколько раз, каждый раз закрывая/открывая isql
все время 0.24258612526701118
ASA 9.0.2 3320
...
Рейтинг: 0 / 0
Кеширование функций и процедур
    #34245057
Егор Комов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, точно, каждое новое открытие - одинаковый результат. Значит штатный Random не проходит.
Буду искать другой....
...
Рейтинг: 0 / 0
Кеширование функций и процедур
    #34245147
antand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так и есть, все правильно.
* задает начало последовательности.
rand(*) конечно вернет одно и то же первое!!! значение.
Следующий вызов rand(*) вернет другое и т.д., но не разрывая соединение.
Если разорвете, то в следующем соединении rand(*) повторит последовательность.
...
Рейтинг: 0 / 0
Кеширование функций и процедур
    #34245837
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот такой формулой устанавливаю новую последовательность случайных чисел для генерации:
Код: plaintext
1.
2.
3.
SELECT Rand()
FROM sa_RowGenerator( 1 ,  10 )
WHERE Rand(DatePart(ms, CURRENT TIMESTAMP) - DatePart(ss, CURRENT TIMESTAMP)) IS NOT NULL
Делал для того, чтобы на сайте каждый раз показывались разные банеры с каталога фильмов, работает без претензий.

P.S. Попробуйте заремарить WHERE и в нескольких сессиях запустить запрос - все будет повторяться. С WHERE повторов у сессий не будет.

--
www.rusug.ru - портал русскоязычной группы пользователей Sybase
...
Рейтинг: 0 / 0
Кеширование функций и процедур
    #34246332
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так может автору перед его первым селектом просто вставить пустой
SELECT Rand(DatePart(ms, now()));
следующий вызов rand(*)
должен быть уже уникальным
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Кеширование функций и процедур
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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