Как получить бит-маску аналогично функции BIN_TO_NUM без запроса?
Есть функция BIN_TO_NUM. В докумнетации есть даже пример того, что хотелось бы:
DECLARE
warehouse NUMBER := 1;
ground NUMBER := 1;
insured NUMBER := 1;
result NUMBER;
BEGIN
SELECT BIN_TO_NUM(warehouse, ground, insured) INTO result FROM DUAL;
END;
То есть, получить бит-маску. Но хотелось бы иметь эту функцию в PL/SQL, в котором она недоступна:
declare n number; begin n := bin_to_num (1,0,1,1); end;
/
PLS-00201: identifier 'BIN_TO_NUM' must be declared
Можно ли получить этот же результат без статического SQL запроса?
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
Написать свой аналог функции:
var mask number
declare
subtype bit is binary_integer range 0..1 not null;
type bits is table of bit;
function bin2num (flags bits) return number is
ret number := 0;
begin
for f in 1..flags.count loop
ret := ret*2 + flags(f); end loop;
return ret;
end;
begin
declare
warehouse constant bit := 1;
ground constant bit := 1;
insured constant bit := 1;
begin
:mask := bin2num (bits (warehouse, ground, insured));
end;
end;
/
Результат:
print mask
MASK
----------
7