这是您可能会做的一个示例 - 创建包含每个项目的最新 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>
当您使用 Forms 时,您可以在 WHEN-VALIDATE-RECORD 触发器、PRE-INSERT 中调用 F_PROJ_SL_NO 函数,或者如果您要插入更复杂的数据库触发器,甚至可以创建一个 before insert 数据库触发器表比我为测试目的创建的表。无论如何,这应该是故事中更简单的部分。