Oracle PL / SQL - пример функции BITAND
ФункцияBITAND
обрабатывает свои входы и выход как векторы битов, выход - это побитовое И входов.
В основном он выполняет следующие шаги.
-
Преобразует входные данные в двоичные.
-
Выполняет стандартную побитовую операцию И над этими двумя строками.
-
Преобразует двоичный результат обратно в десятичный и возвращает значение.
1. Примеры BITAND
SELECT BITAND (12,10) FROM DUAL; -- output 8 1 1 0 0 = 12 1 0 1 0 = 10 ------------- 1 0 0 0 = 8
SELECT BITAND(24,18) FROM DUAL; -- output 16 1 1 0 0 0 = 12 1 0 0 1 0 = 18 ------------- 1 0 0 0 0 = 16
Note
Попробуйте это -Binary
to Decimal converter
2. BITAND используется для расчета статуса транзакции.
2.1 In this example suppose txn_details
table contains transaction details of some payment gateway with different banks. Здесь столбецtxn_status
таблицыtxn_details
содержит одно числовое значение, но имеет несколько значений в каждом бите этого значения.
Мы рассматривали значенияtxn_status
как
-
Двоичное значение 001 (десятичное число 1) означает, что запрос отправлен в банк.
-
Двоичное значение 010 (десятичное 2) означает, что ответ получен.
-
Двоичное значение 100 (десятичное 4) означает, что в ответ получена ошибка.
CREATE TABLE txn_details ( TXN_ID number(5) primary key, BANK_NAME varchar2(20), TXN_STATUS number(1) );
2.2 Inserting sample values.
INSERT INTO txn_details VALUES (1,'ABC Bank',3); INSERT INTO txn_details VALUES (2,'National Bank',0); INSERT INTO txn_details VALUES (3,'Corporation Bank',1); INSERT INTO txn_details VALUES (4,'ABC Bank',7);
2.3 The example uses the DECODE
function to provide two values for each of the three bits in the txn_status
value, one value if the bit is turned on and one if it is turned off.
Для столбцаREQ_SENT
BITAND сначала сравниваетtxn_status
с 1 (двоичное 001). Сравниваются только значимые битовые значения, поэтому любое двоичное значение с 1 в крайнем правом бите будет оцениваться положительно и возвращать 1.
Четные числа вернут 0. ФункцияDECODE
сравнивает значение, возвращаемое BITAND, с 1. Если они оба равны 1, то значениеREQ_SENT
равно «ДА», иначе «НЕТ».
Два других столбцаRESPONSE_RECEIVED
иERROR_IN_RESPONSE
оцениваются аналогично.
SELECT txn_id,bank_name,txn_status , DECODE(BITAND(txn_status, 1), 1, 'YES', 'NO') "REQ_SENT", DECODE(BITAND(txn_status, 2), 2, 'YES', 'NO') "RESPONSE_RECEIVED", DECODE(BITAND(txn_status, 4), 4, 'YES', 'NO') "ERROR_IN_RESPONSE" FROM txn_details;
Выход
TXN_ID | НАЗВАНИЕ БАНКА | TXN_STATUS | REQ_SENT | RESPONSE_RECEIVED | ERROR_IN_RESPONSE |
---|---|---|---|---|---|
1 |
ABC Bank |
3 |
YES |
YES |
NO |
2 |
Национальный банк |
0 |
NO |
NO |
NO |
3 |
Корпорация Банк |
1 |
YES |
NO |
NO |
4 |
ABC Bank |
7 |
YES |
YES |
YES |