Главная страница
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.041 c
15-1150349099
Layner
2006-06-15 09:24
2006.07.16
Delphi 2006, можно ди вернуться к интерфейсу как у Delphi 7?


1-1149586836
Dyakon_Frost
2006-06-06 13:40
2006.07.16
Потоки - Загрузка процессора


2-1151395315
312Kbps
2006-06-27 12:01
2006.07.16
Диалог ввода даты !


2-1151658794
fast2
2006-06-30 13:13
2006.07.16
Как перевести строку (типа String) в последовательность...


15-1150564169
TUser
2006-06-17 21:09
2006.07.16
Это сделали взрослые