Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.47 MB
Время: 0.031 c
15-1150417876
tButton
2006-06-16 04:31
2006.07.16
eng->rus


2-1151495331
mfender
2006-06-28 15:48
2006.07.16
TTreeNode


15-1150350168
beta
2006-06-15 09:42
2006.07.16
Карманная цифровая фотокамера


2-1151653536
XTD
2006-06-30 11:45
2006.07.16
Командная строка


15-1150658905
zxcv
2006-06-18 23:28
2006.07.16
Nokia WAP Toolkit 2.0