create or replace function bit_f_and(in_value IN NUMBER, in_mask IN NUMBER)
return number is
i number;
n_result number;
n_value number;
n_mask number;
begin
n_value := in_value;
n_mask := in_mask;
i := 0;
n_result := n_value;
while n_value > 0 loop
if (mod(n_mask, 2) = 0) and (mod(n_value, 2) = 1) then ?
n_result := n_result - power(2, i); ?
end if;
n_value := TRUNC(n_value / 2); ?
n_mask := TRUNC(n_mask / 2);
i := i + 1;
end loop;
return n_result;
end;
还有for update of OUT_PRICE, OUT_MONEY, STATUS; 是起什么作用的呀?
for update of columns 表示这个select游标可以更新columns
这个函数应该"与"的位运算
if (mod(n_mask, 2) = 0) and (mod(n_value, 2) = 1) then
--表示n_mask的最后一位为0且n_value的最后一位为1,也就是说掩码要求为0,但是此位上原值为1
--这个地方一共有四种情况,两者都是1,两者都是0,0/1,1/0,按照这个算法的逻辑(返回值是在原in_value的基础之上获得),假设v=in_value的第i位,m=in_mask的第i位,r=n_result的第i位
--v=1,m=1时,r应该是1,r=v,不需改
--v=0,m=0时,r应该是0,r=v,不需改
--v=0,m=1时,r应该是0,r=v,不需改
--v=1,m=0时,r应该是0,r<>v,此时需要去掉v的1值,所以用下面的运算式去掉了该位上的1
n_result := n_result - power(2, i); --去掉此位上的1值
--------------------下面这一段代码表示value和mask都往右移动一位
n_value := TRUNC(n_value / 2); ?
n_mask := TRUNC(n_mask / 2);
i := i + 1;
不知道我解释能不能让你明白
create or replace function bit_f_and(in_value IN NUMBER,in_mask IN NUMBER)
return number is --创建函数bit_f_and,in_value、in_mask是输入参数,返回一个number类型的值
i number; --声明number类型的i、n_result、n_value、n_mask
n_result number;
n_value number;
n_mask number;
begin
n_value := in_value; --蒋传过来的输入参数给n_value、n_mask赋值
n_mask := in_mask;
i := 0; --初始化i
n_result := n_value; --给n_result赋值
while n_value > 0 loop --当满足n_value > 0时进入循环
if (mod(n_mask, 2) = 0) and (mod(n_value, 2) = 1) then ?
--mod表示的是%,表示的是n_mask对 2取余。如果同时满足(mod(n_mask, 2) = 0)和(mod(n_value, 2) = 1)就执行if条件里
n_result := n_result - power(2, i); ? power是升幂。即2的i次方
end if;
n_value := TRUNC(n_value / 2); ? --取整,即蒋小数点后面全部省去
n_mask := TRUNC(n_mask / 2);
i := i + 1;
end loop;
return n_result;
end;
还有for update of OUT_PRICE, OUT_MONEY, STATUS; 是起什么作用的呀?
--表示同步更新,当OUT_PRICE, OUT_MONEY, STATUS字段的值发生改变,蒋同步更新数据
希望对你有帮助!