以另一种形式,如果我选择project-1 sl,则无需从项目主数据生成(21819001)。成功保存1条记录后,如果我选择相同的project-1 sl无需为下一个21819003生成类似21819002的代码,等等。
如果选择“ projects-3 sl”,则再次保存3条记录后应生成41819001,依此类推。
我正在使用Oracle Forms 10g。
答案 0 :(得分:0)
这是您可能会做的一个示例-创建另一个表,其中包含每个项目的最新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
函数,甚至可以在插入数据库触发器之前创建 数据库触发器。重新插入到比我为测试目的而创建的表更复杂的表中。无论如何,那应该是故事的简单部分。