Пример использования Oracle PL/SQL - BITAND

Oracle PL / SQL - пример функции BITAND

ФункцияBITAND обрабатывает свои входы и выход как векторы битов, выход - это побитовое И входов.

В основном он выполняет следующие шаги.

  1. Преобразует входные данные в двоичные.

  2. Выполняет стандартную побитовую операцию И над этими двумя строками.

  3. Преобразует двоичный результат обратно в десятичный и возвращает значение.

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 как

  1. Двоичное значение 001 (десятичное число 1) означает, что запрос отправлен в банк.

  2. Двоичное значение 010 (десятичное 2) означает, что ответ получен.

  3. Двоичное значение 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