Главная страница
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.042 c
2-1151585789
Ja Rule
2006-06-29 16:56
2006.07.16
преобразовать форму в фрейм


2-1151248740
b.o.n.d.007
2006-06-25 19:19
2006.07.16
TChart


9-1131821987
Кефир87
2005-11-12 21:59
2006.07.16
gluProject вызывает Run time error?!


3-1147790931
Popoilyk
2006-05-16 18:48
2006.07.16
Импорт данных в DBGrid


5-1135472981
sirin
2005-12-25 04:09
2006.07.16
Список классов, зарегестрированных в Delphi