Oracle n'est pas intégré pour effectuer ce type de conversion. Dans l'exemple suivant, j'utilise deux fonctions avec the inestimable Mr Kyte. to_dec()
transforme les autres bases en décimales et to_base()
transforme les décimales en autres bases.
La procédure prend un tableau de zéros et les uns et retourne une chaîne de la 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;
/
La preuve du pudding, et tout ce qui ...
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>
modifier
Pendant que j'assemblais cet exemple, vous avez indiqué que votre tableau de zéros était long d'environ 450 entrées. Cette routine ne va pas gérer quelque chose comme ça. Il lancera ORA-01426: numeric overflow
avant que vous atteigniez un nombre de cette taille.
modifier 2
Si vous êtes heureux de jouer avec un peu d'imprécision, vous pouvez remplacer les variables NUMÉRIQUES avec des variables BINARY_DOUBLE (dans les deux mon échantillon et les fonctions de Tom). Ce type de données peut gérer des nombres beaucoup plus importants. Je coudés jusqu'à ce array_count=470
, ce qui pourrait ressembler à ceci dans la base 36:
EKQA1EJ6QB4SC8WOOWKWGGOS4KWWWWCS4WCW4SCWCOSOOS888K4CSC8SWO8OCKC8SSCWCOGK844CKG00SOW8KGS0CC4
base de données = 11g oracle, btw – foret
Je ne reçois pas l'offre de primes. Est-ce une référence de la culture pop? – MJB
Quelle est la longueur du tableau? Sera-t-il compatible avec un type Oracle NUMBER (38 chiffres)? –