最近在用Oracle的bitand函数是遇到了一个奇怪的现象:
declare
n number default
374123538;
val number;
begin
dbms_output.enable;
val := bitand(n,
16777215);
dbms_output.put_line(val);
end;
/
结果正确:
5024786
PL/SQL procedure successfully completed
然后修改这个n值:
declare
n number default
3741235380;
val number;
begin
dbms_output.enable;
val := bitand(n,
16777215);
dbms_output.put_line(val);
end;
/
结果出错:
ORA-01426: 数字溢出
ORA-06512: 在line 6
然后我将用法修改:
declare
n number default 3741235380;
val number;
begin
dbms_output.enable;
--val := bitand(n,
16777215); select bitand(n,
16777215) into val from dual; dbms_output.put_line(val);
end;
/
结果又正确:
16693428
PL/SQL procedure successfully completed
奇怪,难度Oracle的PL/SQL中select ... into...和直接赋值不同?
就这个问题我在网上搜索,还发现有人遇到:
select bitand(1,2) from dual会报错:
ORA-00932: 数据类型不一致
用一个函数将bitand包含起来即能解决该问题
例:
select to_char(bitand(1,2)) from dual;
select to_number(bitand(1,2)) from dual;
但我没有遇到,可能是Oracle版本的原因。
真是一个奇怪的问题!