Главная страница
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.48 MB
Время: 0.034 c
2-1151290523
learner
2006-06-26 06:55
2006.07.16
Передача функции класса как параметра в др. функцию


15-1150722901
lookin
2006-06-19 17:15
2006.07.16
Защита интеллектуальной собственности...


2-1151566950
KaLLeKa
2006-06-29 11:42
2006.07.16
Как разместить компонент внутри другого компонента?


3-1147684174
petvv
2006-05-15 13:09
2006.07.16
Help List index out of bounds (0)


1-1149082572
adalx
2006-05-31 17:36
2006.07.16
Компоненты