Вот пример того, что вы можете сделать - создать дополнительную таблицу, которая содержит самые последние SL_NO для каждого проекта.Этот номер создается с помощью функции автономной транзакции, которая гарантирует, что в многопользовательской среде вы не получите дубликаты.
PROJECTS_MASTER
таблица и некоторые примеры данных:
SQL> create table projects_master
2 (project number primary key);
Table created.
SQL> insert into projects_master
2 select 21819001 from dual union all
3 select 41819001 from dual;
2 rows created.
Эта таблица будет содержать самые последние SL_NO
для каждого проекта
SQL> create table projects_sl_no
2 (project number constraint fk_prsl references projects_master (project),
3 sl_no number);
Table created.
Сама функция;если строка для PAR_PROJECT
существует, она обновит ее.В противном случае он создаст новую строку в таблице PROJECTS_SL_NO
.
SQL> create or replace function f_proj_sl_no
2 (par_project in projects_master.project%type)
3 return projects_sl_no.sl_no%type
4 is
5 pragma autonomous_transaction;
6 l_sl_no projects_sl_no.sl_no%type;
7 begin
8 select b.sl_no + 1
9 into l_sl_no
10 from projects_sl_no b
11 where b.project = par_project
12 for update of b.sl_no;
13
14 update projects_sl_no b
15 set b.sl_no = l_sl_no
16 where b.project = par_project;
17
18 commit;
19 return (l_sl_no);
20 exception
21 when no_data_found
22 then
23 lock table projects_sl_no in exclusive mode;
24
25 insert into projects_sl_no (project, sl_no)
26 values (par_project, par_project);
27
28 commit;
29 return (par_project);
30 end f_proj_sl_no;
31 /
Function created.
Тестирование:
SQL> select f_proj_sl_no(21819001) sl_no from dual;
SL_NO
----------
21819001
SQL> select f_proj_sl_no(21819001) sl_no from dual;
SL_NO
----------
21819002
SQL> select f_proj_sl_no(21819001) sl_no from dual;
SL_NO
----------
21819003
SQL> select f_proj_sl_no(41819001) sl_no from dual;
SL_NO
----------
41819001
SQL> select * from projects_sl_no;
PROJECT SL_NO
---------- ----------
21819001 21819003
41819001 41819001
SQL>
При использовании форм вы можете вызвать функцию F_PROJ_SL_NO
вТриггер WHEN-VALIDATE-RECORD
, PRE-INSERT
или даже создание перед вставкой триггера базы данных, если вы вставляете в более сложную таблицу, чем те, которые я создал для целей тестирования.Во всяком случае, это должно быть более простой частью истории.