事情是这样的。我有一个由0和1组成的数组,它应该是一个二进制字符串。我需要的是将其格式化为包含从该二进制文件进行base36转换的字符串。换句话说,我需要这样做: array of 1 -> 0,->,某种二进制数,把它转换成字符串,base36,->,->。如何做到这一点?
数以千计的石油,300钢和+1幸运的答案。
发布于 2010-05-12 22:28:36
没有内置Oracle来执行这种类型的转换。在下面的示例中,我使用了两个由the inestimable Mr Kyte验证的函数。to_dec()将其他基数转换为小数,to_base()将小数转换为其他基数。
该过程接受一个由1和0组成的数组,并返回一个基数为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>编辑
当我组装这个示例时,您发布的0数组长度约为450个条目。这个例程不会处理这样的事情。它会在你达到这个大小之前抛出ORA-01426: numeric overflow。
编辑2个
如果您愿意冒一点不精确的风险,您可以用BINARY_DOUBLE变量替换NUMBER变量(在我的示例和Tom的函数中都是如此)。该数据类型可以处理更大的数字。我把它调到了array_count=470,它在base 36中可能看起来像这样:
EKQA1EJ6QB4SC8WOOWKWGGOS4KWWWWCS4WCW4SCWCOSOOS888K4CSC8SWO8OCKC8SSCWCOGK844CKG00SOW8KGS0CC4https://stackoverflow.com/questions/2819114
复制相似问题