Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перевод из десятичной в 37-ричную систему / 11 сообщений из 11, страница 1 из 1
25.11.2010, 17:14
    #36977489
OmegaMale
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из десятичной в 37-ричную систему
Привет. Чисто алгоритмическая задачка, перевод из десятичной в 37ричную систему. Написал такую функцию, может кто подскажет тюнинг для некоторого ускорения? или мож есть что-то поинтересней для генерирования таких ключей? Просто хочу, чтобы записывались они покороче (для имён файлов).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
	FUNCTION GET_NEXT_ID RETURN CHAR IS
		enqStr	CONSTANT VARCHAR2( 255 ) := '0123456789abcdefghijklmnopqrstuvwxyz_';
		base		CONSTANT PLS_INTEGER :=  37 ;
		N		NUMBER;
		S		VARCHAR2( 12 );
	BEGIN
		SELECT SEQ_OBJ_ID.NEXTVAL INTO N FROM DUAL;
		
		WHILE N > base LOOP 
			S := SUBSTR(enqStr, MOD(N,base)+ 1 ,  1 ) || S;
			N := TRUNC(N / base);
		END LOOP;

		RETURN SUBSTR(enqStr, N+ 1 ,  1 ) || S;
	END GET_NEXT_ID;
...
Рейтинг: 0 / 0
25.11.2010, 17:17
    #36977496
OmegaMale
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из десятичной в 37-ричную систему
OmegaMale,

да, про строку CHAR(37) - это понятно :)
...
Рейтинг: 0 / 0
25.11.2010, 17:25
    #36977528
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из десятичной в 37-ричную систему
OmegaMale,

см. stff
...
Рейтинг: 0 / 0
25.11.2010, 17:26
    #36977532
_Nikotin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из десятичной в 37-ричную систему
можно попробовать так, но не думаю что будет быстрее функции на cи :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create table ID37
(
  id number( 12 ),
  id37 varchar2( 12 ),
  constraint pk_id37 primary key (id)
) organization index;

insert into ID37
select level, GET_ID37_BY_ID(level) connect by level <  100000000 ;
commit;

        FUNCTION GET_NEXT_ID RETURN CHAR IS
		N		NUMBER;
		S		VARCHAR2( 12 );
	BEGIN
		SELECT SEQ_OBJ_ID.NEXTVAL INTO N FROM DUAL;
		SELECT ID37 INTO S FROM ID37 where ID = N;
		RETURN S;
	END;
...
Рейтинг: 0 / 0
26.11.2010, 09:25
    #36978237
OmegaMale
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из десятичной в 37-ричную систему
orawish,

спасибо, это интересно, но у меня Oracle 8.1.7, рекурсивные запросы с DUAL не дружат :( Да и есть подозрение, что PL/SQL тут будет быстрее.
...
Рейтинг: 0 / 0
26.11.2010, 09:26
    #36978239
OmegaMale
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из десятичной в 37-ричную систему
_Nikotin,

Это... это что такое О_о
...
Рейтинг: 0 / 0
26.11.2010, 10:45
    #36978401
_Nikotin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из десятичной в 37-ричную систему
OmegaMale,

Это нагенерить впрок замечательных ID и потом читать их из таблицы, вместо вызова функции. С Вашей функцией это будет не быстрее, особенно если переписать её на си или java. Ещё можно сделать "bulk get id's" где указать количество id, а результат сложить во временную табицу.
...
Рейтинг: 0 / 0
26.11.2010, 11:57
    #36978644
_wildwind_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из десятичной в 37-ричную систему
OmegaMale,

Если немного пожертвовать краткостью ради скорости, то можно так
Код: plaintext
select utl_encode.base64_encode(utl_raw.cast_from_binary_integer( 12345678901234567890 )) enc from dual;
...
Рейтинг: 0 / 0
26.11.2010, 12:04
    #36978666
_wildwind_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из десятичной в 37-ричную систему
_wildwind_,

Пример немного некорректный, т.к. диапазон binary_integer ограничен 2^32. Если нужно больше, используйте number, получится чуть подлиннее.
...
Рейтинг: 0 / 0
30.11.2010, 09:27
    #36985147
OmegaMale
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из десятичной в 37-ричную систему
_NikotinOmegaMale,

Это нагенерить впрок замечательных ID и потом читать их из таблицы, вместо вызова функции. С Вашей функцией это будет не быстрее, особенно если переписать её на си или java. Ещё можно сделать "bulk get id's" где указать количество id, а результат сложить во временную табицу.

ясно, но это было бы полезно для массовых операций, я думаю, если ID были бы трудные. Да и кроме того, нужно чтобы ID были видны только для одной сессии (временная таблица?)... лишняя головная боль, думаю.
...
Рейтинг: 0 / 0
30.11.2010, 09:28
    #36985151
OmegaMale
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод из десятичной в 37-ричную систему
_wildwind_,

у меня не отработает на Oracle 8.1.7 :( Но всё равно спасибо.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перевод из десятичной в 37-ричную систему / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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