Текущий архив: 2006.07.16;
Скачать: CL | DM;
ВнизБитовые операции в Oracle Найти похожие ветки
← →
Ломброзо © (2006-05-12 15:12) [0]Нужно обновить некое значение при помощи битовых операций OR и ANDNOT, навроде
UPDATE MYTABLE SET FIELD = FIELD OR FLAG;
UPDATE MYTABLE SET FIELD = FIELD AND NOT FLAG;
Встроенную функцию BITAND отыскал.
BITOR нашел в гугле:
CREATE OR REPLACE FUNCTION BITOR(A NUMBER, B NUMBER)
RETURN NUMBER IS
BEGIN
IF A IS NULL THEN
RETURN B;
END IF;
IF B IS NULL THEN
RETURN A;
END IF;
RETURN A - BITAND(A, B) + B;
END;
А вот как реализовать AND NOT - ума не приложу :)
← →
sniknik © (2006-05-12 15:28) [1]а разве там нет "нормальных" битовых операций?
по типу MSSQL
OR - | или ^
AND - &
NOT - ~
в доки глянь, должны быть.
← →
Ломброзо © (2006-05-12 15:29) [2]обыскался, нету! :) только BITAND.
← →
Desdechado © (2006-05-12 15:44) [3]там есть классный пакетик utl_raw
применяя его, получаемFUNCTION ascii_raw( p_raw IN VARCHAR2 )
RETURN NUMBER DETERMINISTIC
AS
nLen NUMBER := Length( p_raw );
result NUMBER := 0;
BEGIN
FOR i IN 1..nLen LOOP
result := result * 256 + ASCII( SubStr( p_raw, nLen - i + 1, 1 ) );
END LOOP;
RETURN( result );
END ascii_raw;
--
FUNCTION bit_and( p_dec1 IN NUMBER, p_dec2 IN NUMBER )
RETURN VARCHAR2 DETERMINISTIC
AS
BEGIN
RETURN ascii_raw( utl_raw.cast_to_varchar2( utl_raw.bit_and( raw_ascii( p_dec1 ),
raw_ascii( p_dec2 ) ) ) );
END bit_and;
---
FUNCTION bit_or( p_dec1 IN NUMBER, p_dec2 IN NUMBER )
RETURN VARCHAR2 DETERMINISTIC
AS
BEGIN
RETURN ascii_raw( utl_raw.cast_to_varchar2( utl_raw.bit_or( raw_ascii( p_dec1 ),
raw_ascii( p_dec2 ) ) ) );
END bit_or;
---
FUNCTION bit_xor( p_dec1 IN NUMBER, p_dec2 IN NUMBER )
RETURN VARCHAR2 DETERMINISTIC
AS
BEGIN
RETURN ascii_raw( utl_raw.cast_to_varchar2( utl_raw.bit_xor( raw_ascii( p_dec1 ),
raw_ascii( p_dec2 ) ) ) );
END bit_xor;
---
FUNCTION raw_ascii( p_dec IN NUMBER )
RETURN RAW DETERMINISTIC
AS
nTmp NUMBER := p_dec;
result VARCHAR2( 1999 );
BEGIN
LOOP
result := result || Chr( Mod( nTmp, 256 ) );
nTmp := Trunc( nTmp / 256 );
EXIT WHEN( nTmp = 0 );
END LOOP;
RETURN( utl_raw.cast_to_raw( result ) );
END raw_ascii;
← →
Ломброзо © (2006-05-12 16:01) [4]Ой как всё сложно.
А вот и BITANDNOT
CREATE OR REPLACE FUNCTION BITANDNOT(A NUMBER, B NUMBER) RETURN NUMBER
IS
BEGIN
RETURN A - (BITAND(A, B));
END;
Страницы: 1 вся ветка
Текущий архив: 2006.07.16;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.008 c