Примерно так?
Контрольный пример:
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>