Побитовые операции

Модераторы: kdv, CyberMax

Ответить
AnnB
Сообщения: 8
Зарегистрирован: 01 июн 2009, 06:44

Побитовые операции

Сообщение AnnB » 01 июн 2009, 06:49

Подскажите плз как записать операцию типа x=x & ~ 16 в WHERE.
С первым понятно BIN_AND, а как быть с отрицанием?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Побитовые операции

Сообщение WildSery » 01 июн 2009, 11:33

x = bin_and(x, bin_xor(16, -1))

AnnB
Сообщения: 8
Зарегистрирован: 01 июн 2009, 06:44

Re: Побитовые операции

Сообщение AnnB » 01 июн 2009, 18:29

Большое СПАСИБО!!!

AnnB
Сообщения: 8
Зарегистрирован: 01 июн 2009, 06:44

Re: Побитовые операции

Сообщение AnnB » 11 июн 2009, 01:24

Выяснилось, что в WHERE это не работает в лоб, и пишет, что выражения в этих функциях недопустимы. Требуются небольшие танцы с бубном, в отличие от других RDBMS....
Хотя чисто если сделать SELECT, то всё выдаёт нормально, но в хранимой процедуре никак. #-o

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Побитовые операции

Сообщение WildSery » 11 июн 2009, 12:09

Что именно не работает, покажешь?

AnnB
Сообщения: 8
Зарегистрирован: 01 июн 2009, 06:44

Re: Побитовые операции

Сообщение AnnB » 12 июн 2009, 02:42

В хранимой процедуре я был вынужден сделать так:

negFlags=BIN_XOR(1,-1);
tmpFlags=BIN_AND(:tmpFlags,:negFlags);

UPDATE objQual_Topic
SET "Flags" = :tmpFlags
WHERE "TopicID" = :i_TopicID;
Но так не работает:

UPDATE objQual_Topic
SET "Flags" = :tmpFlags
WHERE "TopicID" = BIN_AND(:tmpFlags,BIN_XOR(1,-1));

У меня есть есть такие куски, которые возвращают набор строк из SELECT и там используются поля и там я сделал обработку в блоке DO BEGIN ... END.

Иначе ошибка при сохранении процедуры. В SELECT чисто как отдельный запрос всё работает. Подозреваю проблемы с PSQL.
Пока я тестировал этот кусок с Firebird 2.1.2. Но в данном случае как я понимаю код базы в обоих случаях аналогичен.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Побитовые операции

Сообщение WildSery » 15 июн 2009, 11:46

Вероятно, ты запутался в типах переменных. Смотри, что INT и BIGINT - разные.

Ответить