Уменьшить предыдущий счетчик данных, если присутствующие отправляющие данные такие же, как предыдущие - PullRequest
0 голосов
/ 13 мая 2018

Предположим, у меня есть список данных (oracle MY_SQL), например,

 State   RPD     Mac_address        total_Mac_Online_Count.     
 26      AA      aa:bb:12:cc:ab:aa  1
 26      BB      aa:bb:12:cc:ab:ab  1
 26      CC      aa:bb:12:cc:ab:ac  1
 26      DD      aa:bb:12:cc:ab:ad  1
 26      EE      aa:bb:12:cc:ab:bb  1

. При этом я отправляю такие данные в db

 26      AB      aa:bb:12:cc:ab:ac

Mac_address такой же, как для RPD"CC".Теперь total_Mac_Online_Count должен уменьшиться на единицу для RPD "CC"

 26      CC      aa:bb:12:cc:ab:ac  0

, а для новых данных он должен обычно добавляться как

 26      AB      aa:bb:12:cc:ab:ac  1

Заранее спасибо.

1 Ответ

0 голосов
/ 13 мая 2018

Примерно так?

Контрольный пример:

SQL> create table mac
  2    (state number,
  3     rpd varchar2(2),
  4     mac_address varchar2(20) constraint uk_mac unique,
  5     total_count number
  6    );

Table created.

SQL> insert into mac
  2    select 26, 'aa', 'aa:bb:12:cc:ab:aa', 1 from dual union
  3    select 26, 'bb', 'aa:bb:12:cc:ab:ab', 1 from dual union
  4    select 26, 'cc', 'aa:bb:12:cc:ab:ac', 1 from dual;

3 rows created.

Процедура: я выделяю всю строку в локальную переменную.Как вы могли бы получить NO_DATA_FOUND, я справляюсь с этим (ничего не делая 1008 *).Если есть совпадение, я вычитаю значение столбца TOTAL_COUNT на 1 для той же строки MAC-адреса и вставляю всю новую строку.

Однако, похоже, что эта модель поддерживает дублированные MAC-адреса.Это законно?Что вы хотите сделать в таких случаях?Например, если вы введете тот же MAC-адрес еще раз?SELECT вернет TOO_MANY_ROWS, который должен быть обработан.Один из вариантов - обновить только одну (какую?) Строку;или ...?

SQL> create or replace procedure p_mac
  2    (par_state in number, par_rpd in varchar2, par_mac_address in varchar2)
  3  is
  4    l_row mac%rowtype;
  5  begin
  6    select *
  7      into l_row
  8      from mac
  9      where mac_address = par_mac_address;
 10
 11    update mac set
 12      total_count = total_count - 1
 13      where mac_address = par_mac_address;
 14
 15    insert into mac (state, rpd, mac_address, total_count)
 16    values
 17    (par_state, par_rpd, par_mac_address, 1);
 18  exception
 19    when no_data_found then null;
 20  end;
 21  /

Procedure created.

Тестирование:

SQL> select * from mac;

     STATE RP MAC_ADDRESS          TOTAL_COUNT
---------- -- -------------------- -----------
        26 aa aa:bb:12:cc:ab:aa              1
        26 bb aa:bb:12:cc:ab:ab              1
        26 cc aa:bb:12:cc:ab:ac              1

SQL> exec p_mac(26, 'ab', 'aa:bb:12:cc:ab:ac');

PL/SQL procedure successfully completed.

SQL> select * From mac;

     STATE RP MAC_ADDRESS          TOTAL_COUNT
---------- -- -------------------- -----------
        26 aa aa:bb:12:cc:ab:aa              1
        26 bb aa:bb:12:cc:ab:ab              1
        26 cc aa:bb:12:cc:ab:ac              0
        26 ab aa:bb:12:cc:ab:ac              1

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...