Нет встроенного Oracle для такого преобразования. В следующем примере я использую две функции, подтвержденные бесценным мистером Кайтом . to_dec()
превращает другие основания в десятичные, а to_base()
превращает десятичные в другие.
Процедура принимает массив единиц и нулей и возвращает строку с базой 36.
create or replace type binary_nt as table of number(1,0);
/
create or replace function base2_to_base36
(p_onesnzeroes in binary_nt)
return varchar2
is
s_b2 varchar2(38);
n_b10 pls_integer;
s_b36 varchar2(38);
begin
for i in 1..p_onesnzeroes.count()
loop
s_b2 := s_b2||trim(to_char(p_onesnzeroes(i)));
end loop;
n_b10 := to_dec(s_b2, 2);
s_b36 := to_base(n_b10, 36);
return s_b36;
end;
/
Доказательство пудинга и все такое ...
SQL> set serveroutput on size unlimited
SQL> declare
2 bins binary_nt := binary_nt(1,0,0,0,1,1,1,0);
3 s varchar2(128);
4 begin
5 -- 10001110 => 142 => 3Y
6 s := base2_to_base36(bins);
7 dbms_output.put_line(s);
8 end;
9 /
3Y
PL/SQL procedure successfully completed.
SQL>
редактировать
Пока я собирал этот пример, вы писали, что ваш массив нулей составлял ~ 450 записей. Эта рутина не справится с чем-либо подобным. Он будет швырять ORA-01426: numeric overflow
, прежде чем вы попадете в число такого размера.
редактировать 2
Если вы счастливы играть с небольшой неточностью, вы можете заменить переменные NUMBER переменными BINARY_DOUBLE (как в моем примере, так и в функциях Тома). Этот тип данных может обрабатывать гораздо большие числа. Я провернул его до array_count=470
, что может выглядеть следующим образом в базе 36:
EKQA1EJ6QB4SC8WOOWKWGGOS4KWWWWCS4WCW4SCWCOSOOS888K4CSC8SWO8OCKC8SSCWCOGK844CKG00SOW8KGS0CC4