Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA-как поступить? Одно черное в белый горох, другое - белое в черный / 14 сообщений из 14, страница 1 из 1
30.09.2004, 16:41
    #32718852
mustlive
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
Задачка такая есть.
Существует таблица с ключами (хэш ключей). Есть функция getkey(), которая инкрементирует значение ключа и возвращает новое значение.

Так вот. Часто приходится получать ключи, но, к сожалению, не могу понять - как это сделать из процедуры. Т.е. если в некоей процедуре сделать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
insert into dba.newnames
select getkey() as newkey, 
         name,
         lastname,
         age 
from dba.names

то все newkey'и получат одно и то же значение ключа. Я так понимаю, что изменения в хеше ключей не Commit'ятся после первого вызова функции. Commit в самой функции не помогает, да и нежелателен он - мало ли что дальше произойдет.

Приходится пихать данные во временную таблицу, бегать курсором по ней и получать в цикле ключи. Так работает (почему-то)

Что можно придумать, чтобы функция ВСЕГДА возвращала правильный ключ? Или это невозможно в принципе? Атомарная операция?
...
Рейтинг: 0 / 0
30.09.2004, 17:21
    #32718947
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
Использовать NEWID() вместо getkey()?
Можно попробовать запихнуть NEWID() или NOW() внутрь твоей getkey(), впрочем не уверен что поможет.
...
Рейтинг: 0 / 0
30.09.2004, 18:40
    #32719038
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
Код: plaintext
1.
2.
3.
4.
5.
CREATE FUNCTION GetKey ()
RETURNS varchar( 50 )
NOT DETERMINISTIC  // Отключает кэширование функции 
BEGIN
   // ... 
END;
...
Рейтинг: 0 / 0
30.09.2004, 20:18
    #32719182
mustlive
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
NOT DETERMINISTIC, говоришь?

ээээ... у меня этой опции АСА еще нет. Другие варианты есть?
...
Рейтинг: 0 / 0
01.10.2004, 00:08
    #32719302
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
Попробуйте сделать в функции GetKey() параметр и передавать туда любое поле с запроса. Тогда по идее ASA должна сообразить, что функцию нужно вызывать для каждой записи. Если не сообразит, значит нужно все как есть оставить на курсорах.
...
Рейтинг: 0 / 0
01.10.2004, 00:49
    #32719318
mustlive
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
Параметр там уже есть (мне же неинтересно получать новые ключи только для одной таблицы, таблиц-то много :)

К сожалению, не работает :(

А как воообще народ делает? Может, есть более гибкие решения с хэшем ключей? Или все юзают автоинкременты? (ни за что не поверю!)
...
Рейтинг: 0 / 0
01.10.2004, 07:15
    #32719378
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
Можно попробовать вставить GetKey() в DEFAULT столбца таблицы и не указывать его в INSERT. Если в Вашей версии ASA поддерживается инициализация полей в триггерах BEFORE INSERT, то можно в таком триггере инициализировать поле значением этой функции.

авторА как воообще народ делает? Может, есть более гибкие решения с хэшем ключей? Или все юзают автоинкременты? (ни за что не поверю!)
Именно юзаю инкременты :) Если сильно бы прижало, то использовал бы GUID, но с хэшем ключей не стал бы связываться, по моему больше геммора, чем толку.
...
Рейтинг: 0 / 0
01.10.2004, 09:14
    #32719446
L0cat0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
NOT DETERMINISTIC появился в 8.0.3
чтобы заставить коректно генерировать ключи ранее приходилось передавать как параметр уникальное значение по текущей выборке(чтобы оно менялось от записи к записи) и впринципе не важно что, главное его изменение, что вызывало перезагрузку функции
Удачи !
...
Рейтинг: 0 / 0
01.10.2004, 10:19
    #32719546
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
Или все юзают автоинкременты?
Именно их мы и юзаем :). "Зачем делать сложным, что проще простого".
...
Рейтинг: 0 / 0
01.10.2004, 10:20
    #32719549
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
L0cat0rNOT DETERMINISTIC появился в 8.0.3
8.0.1 (RTFM :)).
...
Рейтинг: 0 / 0
01.10.2004, 20:58
    #32720882
mustlive
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
L0cat0r, большое спасибо, этот способ действительно работает.

Я добавил этой функции параметр dummy и передаю Number(). Все заработало.

Интересно, а как вы до этого дошли? Методом научного тыка или дедуктивно, изучая документацию?
...
Рейтинг: 0 / 0
04.10.2004, 14:45
    #32722269
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
mustliveЯ добавил этой функции параметр dummy и передаю Number(). Все заработало.
Кстати, о какой версии ASA идёт речь? Или это Очень Страшная Тайна ?

Интересно, а как вы до этого дошли? Методом научного тыка или дедуктивно, изучая документацию?
А какое ещё есть объяснение для ситуации "функция должна вызываться много раз, но вызывается один раз"?
...
Рейтинг: 0 / 0
04.10.2004, 23:02
    #32723056
mustlive
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
автор
Кстати, о какой версии ASA идёт речь? Или это Очень Страшная Тайна ?


5-я. Но мне кажется, это работает (или не работает, смотря с какой точки зрения смотреть) и в более новых. Если не использовать NOT DETERMINISTIC.

автор
А какое ещё есть объяснение для ситуации "функция должна вызываться много раз, но вызывается один раз"?


Не знаю. Не путайте, она вызывается не один раз, т. е. честно отрабатывает. Если вставить например message в ее тело и вызвать ее в цикле, то сообщение будет честно вылезать на каждый вызов.
...
Рейтинг: 0 / 0
05.10.2004, 10:25
    #32723360
L0cat0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
mustlive
автор
А какое ещё есть объяснение для ситуации "функция должна вызываться много раз, но вызывается один раз"?


Не знаю. Не путайте, она вызывается не один раз, т. е. честно отрабатывает. Если вставить например message в ее тело и вызвать ее в цикле, то сообщение будет честно вылезать на каждый вызов.

Похоже что при работе с функцией для ускорения ASA кеширует где-то (?)последние входящие переменные и результат, и если новый вызов происходит по закешированным входящим - то исходящий результат берется из кеша (?!!)

Вызов в цикле даст message, а вот на выборке его даст только точка входа (первая запись) или изменение вх. параметра

NOT DETERMINISTIC отрубает это кеширование
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA-как поступить? Одно черное в белый горох, другое - белое в черный / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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